C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: DataGridViewのチェックボックスチェック


(過去ログ 62 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■36044 / inTopicNo.1)  DataGridViewのチェックボックスチェック
  
□投稿者/ がんすけ (1回)-(2009/05/19(Tue) 02:10:54)

分類:[VB.NET/VB2005 以降] 

はじめまして、Microsoft Visual Basic 2005で開発をしています。

今、下記の様なDataGridViewのチェックボックスがある列をクリックされた時に
クリックされたチェックボックスがTrueかFalseかチェックするプログラムを書いています。

    Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick

        If DataGridView1.Rows(e.RowIndex).Cells(0).Value = True Then
            MsgBox("falseになりました。")
        Else
            MsgBox("Trueになりました。")
        End If

end sub

このロジックでチェックボックスが全部Falseの状態で
一行名のチェックボックスを押下すると
「Trueになりました。」
その後三行目のチェックボックスを押下すると
「Trueになりました。」
その後一行名のチェックボックスを押下すると
「Falseになりました。」

となりますが、何故か

一行名のチェックボックスを押下すると
「Trueになりました。」
その後また一行名のチェックボックスを押下すると
「Trueになりました。」
と表示されてしまいます。
二回連続で同じ場所をクリックすると一番最初のValueの結果から変わりません
同じ場所が二度クリックされてもその時の状況がちゃんとValueで取得出来る様にするには
どの様にすれば宜しいのでしょうか?

よろしくご教授の程お願い致します。

引用返信 編集キー/
■36045 / inTopicNo.2)  Re[1]: DataGridViewのチェックボックスチェック
□投稿者/ .SHO (829回)-(2009/05/19(Tue) 09:11:35)
No36044 (がんすけ さん) に返信

直接の回答ではないですが、e.RowIndex の値を確認してみてはどうでしょう?
引用返信 編集キー/
■36046 / inTopicNo.3)  Re[1]: DataGridViewのチェックボックスチェック
□投稿者/ カドルドエグ (81回)-(2009/05/19(Tue) 09:12:55)
No36044 (がんすけ さん) に返信
> 一行名のチェックボックスを押下すると
> 「Trueになりました。」
> その後また一行名のチェックボックスを押下すると
> 「Trueになりました。」
> と表示されてしまいます。
> 二回連続で同じ場所をクリックすると一番最初のValueの結果から変わりません
DataGridView.CellContentClick イベント
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.cellcontentclick(VS.80).aspx
↑ここに
「DataGridViewCheckBoxCell をクリックすると、このイベントは、チェック ボックスが値を変更する前に発生します。
したがって、現在の値に基づいて予期される値を計算する必要がない場合、
通常はこのイベントの代わりに DataGridView.CellValueChanged イベントを処理します。
このイベントは、ユーザー指定の値がコミットされたとき (通常はフォーカスがセルを離れたとき) にだけ発生するため、
DataGridView.CurrentCellDirtyStateChanged イベントも処理する必要があります。」
とあるので、そのことも原因のひとつとして考えられるかなと思います。
引用返信 編集キー/
■36047 / inTopicNo.4)  Re[2]: DataGridViewのチェックボックスチェック
□投稿者/ .SHO (830回)-(2009/05/19(Tue) 09:22:11)
No36046 (カドルドエグ さん) に返信

> 「DataGridViewCheckBoxCell をクリックすると、このイベントは、チェック ボックスが値を変更する前に発生します。

だから

>If DataGridView1.Rows(e.RowIndex).Cells(0).Value = True Then
> MsgBox("falseになりました。")

True だと false なんじゃないでしょうか。
引用返信 編集キー/
■36048 / inTopicNo.5)  Re[1]: DataGridViewのチェックボックスチェック
□投稿者/ 魔界の仮面弁士 (1075回)-(2009/05/19(Tue) 10:31:16)
No36044 (がんすけ さん) に返信
> 同じ場所が二度クリックされてもその時の状況がちゃんとValueで取得出来る様にするには
> どの様にすれば宜しいのでしょうか?

.RowHeadersVisible を True にしておくと分かりやすいかと思いますが(鉛筆アイコンと≫アイコン)、
そのセルの編集が確定するまで、セル Value 値は変化しません。

CellContentClick は、「セルの内容がクリックされた」事を通知しますが、
だからといって、CheckBox の状態が変化したかどうかという話とは別問題です。

クリック直後に確定させたいのであれば、CellContentClick イベントで EndEdit すれば、
CellValueChanged イベントで CheckBox の状態を捉えられるようになります。
引用返信 編集キー/
■36049 / inTopicNo.6)  Re[3]: DataGridViewのチェックボックスチェック
□投稿者/ カドルドエグ (82回)-(2009/05/19(Tue) 10:40:54)
#書いてる間に既に解決策が…^^;

No36047 (.SHO さん) に返信
> ■No36046 (カドルドエグ さん) に返信
>
>>「DataGridViewCheckBoxCell をクリックすると、このイベントは、チェック ボックスが値を変更する前に発生します。
>
> だから
>
> >If DataGridView1.Rows(e.RowIndex).Cells(0).Value = True Then
>> MsgBox("falseになりました。")
>
> True だと false なんじゃないでしょうか。
そうですね。


>二回連続で同じ場所をクリックすると一番最初のValueの結果から変わりません
>同じ場所が二度クリックされてもその時の状況がちゃんとValueで取得出来る様にするには
とあり、調べた根拠としてMSDNの記事をひっぱってきたのですが、書き方が悪かったようで申し訳ありません。

ContentClickイベントは確かに「値変更前に発生」しますが、
飽くまで「コミットされた状態・値」で判断します。

MSDNのやり方だと別途イベントを設定する必要があるので、
一番手っ取り早いのは魔界の仮面弁士さんの方法ですね。
引用返信 編集キー/
■36050 / inTopicNo.7)  Re[2]: DataGridViewのチェックボックスチェック
□投稿者/ がんすけ (2回)-(2009/05/19(Tue) 11:06:46)
皆様ご教授ありがとう御座います。
EndEditを使用する事により今回の問題は解決いたしました。
今後ともよろしくお願い致します。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -