2015
2
23

VB.NETでDataGridViewをセル編集したときの行数を格納する

DB のテーブルを読み込んだ DataGridView 内のセルが変更された時に、その行数をリストボックスに格納しておきます。ここに入れた行数を後で一気に SQL で処理するぞ、という想定。主キーのフィールドは変更できない機能も。


関連記事

  1. DataGridViewへAccessのデータベースファイルを読み込む
  2. AccessDBテーブルの主キーと各フィールド型を取得する
  3. DataGridViewに読み込んだDB情報を再取得する
  4. DataGridViewをセル編集したときの行数を格納する ←NOW!
  5. Accessのデータベースファイルへ書き込むための接続・切断
  6. Accessデータベースのレコードを削除する
  7. Accessデータベースを更新する

ガッツリ続き物になってしまいました…。過去の分と合わせて順番に読んでいただけると分かりやすいかと思います。

なるべく簡素に書いているので、例外処理は甘いと思われます。ご参考にする際は、ご自分の環境に合わせてご修正ください。

環境

  • Visual Studio 2010
  • .NET Framework 4.0

です。

セルが編集されたら各リストボックスに格納

今回は DataGridView のイベントを利用して書きます。

Form2.vb

新規/既存どちらの行も「セルが変更された」というイベントの11~24行目へ入っていくわけですが、新規で行が追加された場合は先に26~33行の記述を通ってからとなります。ここで該当行を ListBox4 に追加しています。

既に格納されているものは重複しないようにチェックをかけて(14~20行)、UPDATE 用の ListBox3 に追加します(21行)。

また、ユーザーに分かりやすいように変更したセルの色を変えておくといいかも(23行)。

150223-1

これで実行してみて、

150223-2

適当にセルの内容を変えると、このように変更したセルの色が変わり、ListBox3, 4 に該当の行数が入ります。(行数はゼロから始まります。)

主キーは変更できないようにする

さて、でもこのままだと主キーのセルも変更することができてしまうんですよね。

やっぱり、主キーは一度登録されたものは変更できないのが望ましいと思うので、もし該当のセルが主キーだったら「ここは変更できないよー」というメッセージを出して、値を元に戻す、という機能が欲しいなと思いました。

Form2.vb

型を指定しない変数をひとつ用意しておいて、DataGridView のセルがクリックされた時にその変数へ値を入れておく、ということを書いておきます。

そしたら、さっき書いた CellValueChanged イベントの前半に主キーをチェックする記述を入れます。

まず、ListBox4(新規行)の中身をループさせて変更されたセルと比べます(5~7行)。新規だったら編集できないと困りますもんね。6行目は、該当する場合は18行目へジャンプする、という意味です。

ここを抜けると既存行だけになるので、今度は ListBox1(主キーの列数)の中身をループさせて比べます(8~16行)。もし主キーの列と一致したら、メッセージを出して(10行)、元の値に戻し(12行)、プロシージャを終了させます(14行)。12行目で戻す際、ここで更に CellValueChanged が走ってしまうのを防ぐため、イベントを無効/有効にする、という記述で挟んでおきます。

150223-3

これでまた実行してみて、今度は主キーのセルを選択して、

150223-4

変更して隣のセルに移動しようとすると、ダメですよーって言われます。

150223-5

メッセージボックスを閉じると値が戻ります。

エラーを見やすく

更になんですが。

セル編集時、型が違うとか、何かしら条件に一致しない場合、DataGridView からエラーを出されるときがあるんです。

150223-6

こんな感じで、Int型を指定したフィールドに文字列を入れたりすると、

150223-7

ぎゃー!って言いたくなるようなエラー画面w これ、開発者ならまだ良いですけどユーザーさんにはあんまり見せたくないです…。ので、

Form2.vb

DataErrorイベントというのを利用して、エラーが起きた位置と、エラー内容をもっとわかりやすく示してあげます。

27行目、列も行も 0 から数えてしまうのですが、開発者じゃないユーザーさんにはわかりにくいかもしれないので、それぞれ +1 した場所をメッセージとして出してみます。

150223-6

これで、さっきと同じことをすると、

150223-8

さっきよりも断然分かりやすいエラーメッセージが出て、

150223-9

値も元に戻る、という。

まだ SQL まで到達していない…。先が長そうな予感w

  • このエントリーをはてなブックマークに追加
  • follow us in feedly 618
  • RSSを登録

公開日:2015/02/23


コメントを残す




*印は必須項目です。コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にですがスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)


back to top