- PR -

DataGridViewに表示したチェックボックスの値が拾えない

1
投稿者投稿内容
コウジ
ベテラン
会議室デビュー日: 2006/12/18
投稿数: 54
投稿日時: 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)の値を
セットしたいのですが、まったく機能しません。
チェックを入れたときに金額がセットされたりされなかったり、逆にチェックをはずしたときに値がセットされたりと
まったく制御できておりません。

基本的なところがだめなのだろうな〜とは思っているのですが、ネットでの調査だけで時間がかかってしまっているので
質問させていただきました。
どなたかご教示お願いいたします。
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2008-11-15 10:25
Grid_入金情報.Rows(X).Cells(7).Value の値は、どうなのですか?
お だ
会議室デビュー日: 2008/04/02
投稿数: 14
投稿日時: 2008-11-15 11:19
MSDN DataGridView.CellContentClick イベント

以下抜粋。
DataGridViewCheckBoxCell をクリックすると、このイベントは、チェック ボックスが値を変更する前に発生します。
コウジ
ベテラン
会議室デビュー日: 2006/12/18
投稿数: 54
投稿日時: 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 ]
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2008-11-17 23:04
おっと、既に自己解決済みとは・・・

あの後、自分なりに調べ続けたところ、
CellContentClickイベント内で、EditedFormattedValueにより
取得が可能であることが分かりました。

とはいえ、別の解法で解決済みであれば、良かったですね。
コウジ
ベテラン
会議室デビュー日: 2006/12/18
投稿数: 54
投稿日時: 2008-11-17 23:11
にーさま、ありがとうございました。

今後の参考にさせていただきます。
1

スキルアップ/キャリアアップ(JOB@IT)