DataGridViewに表示したチェックボックスの値が拾えない
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-11-15 00:37
いつもお世話になります。
DataGridViewにチェックボックスを表示させており、 チェックを入れると「入金額」列に「請求額」列の値をセットしたいのですが、 Private Sub Grid_入金情報_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Grid_入金情報.CellContentClick X = Grid_入金情報.CurrentRow.Index If Grid_入金情報.Rows(X).Cells(7).Value = True Then Grid_入金情報.Rows(X).Cells(6).Value = Grid_入金情報.Rows(X).Cells(5).Value ElseIf Grid_入金情報.Rows(X).Cells(7).Value = False Then Grid_入金情報.Rows(X).Cells(6).Value = 0 End If End Sub Grid_入金情報.Rows(X).Cells(7)がチェックボックスとなっており、クリックによるon/offの際のValue値で 入金額欄(Grid_入金情報.Rows(X).Cells(6).Value)に請求額欄(Grid_入金情報.Rows(X).Cells(5).Value)の値を セットしたいのですが、まったく機能しません。 チェックを入れたときに金額がセットされたりされなかったり、逆にチェックをはずしたときに値がセットされたりと まったく制御できておりません。 基本的なところがだめなのだろうな~とは思っているのですが、ネットでの調査だけで時間がかかってしまっているので 質問させていただきました。 どなたかご教示お願いいたします。 |
|
投稿日時: 2008-11-15 10:25
Grid_入金情報.Rows(X).Cells(7).Value の値は、どうなのですか?
|
|
投稿日時: 2008-11-15 11:19
MSDN DataGridView.CellContentClick イベント
以下抜粋。 DataGridViewCheckBoxCell をクリックすると、このイベントは、チェック ボックスが値を変更する前に発生します。 |
|
投稿日時: 2008-11-16 15:29
おださん、ニーさん、お返事ありがとうございました。
おださま、そういうことでしたか・・・。 おださんのヒントとリンク先で解決しました。一応後にここを読まれる方のためにも整理しておきます。 また、リンク先に入れなかったので張りなおさせていただきます。 DataGridView.CellContentClick イベント http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.cellcontentclick.aspx ということで単純に先日提示のコードをValueChangedイベントで書き換えなおしたらやはり制御ができず、どうやら移動前のセルインデックスを引きずっている模様でした。 上記サイトをよく読むと、 -------------- このイベントは、ユーザー指定の値がコミットされたとき (通常はフォーカスがセルを離れたとき) にだけ発生するため、DataGridView.CurrentCellDirtyStateChanged イベントも処理する必要があります。そのハンドラでは、現在のセルがチェック ボックス セルの場合、DataGridView.CommitEdit メソッドを呼び出して、Commit 値を渡します。 -------------- ということでしたので以下のようにコードを修正したらうまく制御できるようになりました。 Private Sub Grid_入金情報_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Grid_入金情報.CellContentClick Dim cell As DataGridViewCell = Grid_入金情報.CurrentCell cell.Selected = True Grid_入金情報.CommitEdit(False) End Sub Private Sub Grid_入金情報_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Grid_入金情報.CellValueChanged If Grid_入金情報.Focused = True Then X = Grid_入金情報.CurrentRow.Index Debug.Print(X) Debug.Print(Grid_入金情報.Rows(X).Cells(7).Value) If Grid_入金情報.Rows(X).Cells(7).Value = True Then Grid_入金情報.Rows(X).Cells(6).Value = Grid_入金情報.Rows(X).Cells(5).Value ElseIf Grid_入金情報.Rows(X).Cells(7).Value = False Then Grid_入金情報.Rows(X).Cells(6).Value = 0 End If End If End Sub CellContentClickイベントでCurrentセルを指定しておき、かつ編集モードとやらをCommitEdit(もしくはEndEdit)させてしまい、次いで発生するCellValueChangedイベントで値判定をさせるようにしたらうまく制御できるようになりました。 おださま、にーさまありがとうございました。 [ メッセージ編集済み 編集者: コウジ 編集日時 2008-11-16 15:32 ] |
|
投稿日時: 2008-11-17 23:04
おっと、既に自己解決済みとは・・・
あの後、自分なりに調べ続けたところ、 CellContentClickイベント内で、EditedFormattedValueにより 取得が可能であることが分かりました。 とはいえ、別の解法で解決済みであれば、良かったですね。 |
|
投稿日時: 2008-11-17 23:11
にーさま、ありがとうございました。
今後の参考にさせていただきます。 |
1