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

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

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

Re[8]: DataGridViewCheckBoxの取得


(過去ログ 98 を表示中)

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

■58348 / inTopicNo.1)  DataGridViewCheckBoxの取得
  
□投稿者/ みっつ (4回)-(2011/03/31(Thu) 12:15:57)

分類:[C#] 

何度もすみません。
Windows XP
Visual studio 2010
C#
で開発しています。

先ほどはありがとうございました。

今度は、OKボタンを押下した際に、
チェックがついている行(Rows)の
データ(NAME)を取得したいです。

DataGridViewは
下記のようになっているとします。

CHECK---NAME
[ON]----AAAA
[ON]----BBBB
[ON]----CCCC
[OFF]---DDDD

CHECK--DataGridViewCheckBoxのName
NAME---DataGridViewTextBoxのName
ON-----チェックボックスTrue
OFF----チェックボックスFalse
だと思ってください。

下記はコーディングです。
DataGridViewCheckBoxのFalseValueには0
DataGridViewCheckBoxのTrueValueには1が登録されています。

private void OK_button_Click(object sender, EventArgs e)
{
for(int i = 0;dataGridView1.Rows.Count > i ;i++)
{
if (dataGridView1.Rows[i].Cells["CHECK"].Value.ToString() == "1")※
{
MessageBox.Show(dataGridView1.Rows[i].Cells["NAME"].Value.ToString());
}
}
}

上記のように記述したところ、
MessageBoxで[AAAA]と[BBBB]は
取得することが出来ました。
ですが、[CCCC]は取得できません。
※の部分でエラーになります。

エラー:
NullReferenceExceptionはユーザーコードによってハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。


調べてみると、[CCCC]の時に
dataGridView1.Rows[i].Cells["CHECK"].Value
がnullになっていました。

チェックは間違いなくついているし、
ついていなくても0になると思うのですが・・・
何が原因がわかりますでしょうか?

どう調べたらいいのかもわからず・・・。
NAMEの取得の仕方がすでにおかしいのでしょうか?

よろしくお願いいたします。
引用返信 編集キー/
■58350 / inTopicNo.2)  Re[1]: DataGridViewCheckBoxの取得
□投稿者/ プシケ (2回)-(2011/03/31(Thu) 12:48:17)
2011/03/31(Thu) 13:08:18 編集(投稿者)

No58348 (みっつ さん) に返信
まず、グリッドの行を追加する場合、明示的に0か1をセットした方がよいです。
そうでなければ、nullのケースを考慮した方がよいです。
しかし、このことがこの問題の本質ではありません。
おそらく最後にチェックしたセルのチェックがValueに反映されていないということでしょうか。
(試しに、最後にチェックするセルを変えてみると、その箇所のチェックがValueに反映されていないのでは
ないでしょうか?)
例えば、セルを移動したりするとチェックした内容が反映さると思いますので、これを試してみてください。
こうすることによってチェックがセルのValueに反映されるようであれば、チェックした時点でセルのValueを
更新(コミット)するようにすればよいです。
以下のサイトのCurrentCellDirtyStateChangedイベントの記述を参考にするとよいでしょう。

http://dobon.net/vb/dotnet/datagridview/datagridviewcheckboxcolumn.html
「チェックボックスにチェックが付けられた(あるいはチェックが外された)ことを知る」を参照のこと。
引用返信 編集キー/
■58351 / inTopicNo.3)  Re[2]: DataGridViewCheckBoxの取得
□投稿者/ みっつ (5回)-(2011/03/31(Thu) 13:13:54)
No58350 (プシケ さん) に返信
> 2011/03/31(Thu) 13:08:18 編集(投稿者)
>
> ■No58348 (みっつ さん) に返信
> まず、グリッドの行を追加する場合、明示的に0か1をセットした方がよいです。
> そうでなければ、nullのケースを考慮した方がよいです。
> しかし、このことがこの問題の本質ではありません。
> おそらく最後にチェックしたセルのチェックがValueに反映されていないということでしょうか。
> (試しに、最後にチェックするセルを変えてみると、その箇所のチェックがValueに反映されていないのでは
> ないでしょうか?)
> 例えば、セルを移動したりするとチェックした内容が反映さると思いますので、これを試してみてください。
> こうすることによってチェックがセルのValueに反映されるようであれば、チェックした時点でセルのValueを
> 更新(コミット)するようにすればよいです。
> 以下のサイトのCurrentCellDirtyStateChangedイベントの記述を参考にするとよいでしょう。
>
> http://dobon.net/vb/dotnet/datagridview/datagridviewcheckboxcolumn.html
> 「チェックボックスにチェックが付けられた(あるいはチェックが外された)ことを知る」を参照のこと。

ありがとうございます。

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dataGridView1.CurrentCellAddress.X == 0 &&
dataGridView1.IsCurrentCellDirty)
{
//コミットする
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
このようにやってみました。
これで[CCCC]までは取得できました。
その後、
if (dataGridView1.Rows[i].Cells["CHECK"].Value.ToString() == "1")※
ここで、[DDDD]のCheckBoxを取得しようとしたら
同様のNullエラーになりました。

何がいけないのでしょうか・・・
よろしくお願いいたします。
引用返信 編集キー/
■58353 / inTopicNo.4)  Re[3]: DataGridViewCheckBoxの取得
□投稿者/ プシケ (3回)-(2011/03/31(Thu) 13:24:32)
No58351 (みっつ さん) に返信
> その後、
> if (dataGridView1.Rows[i].Cells["CHECK"].Value.ToString() == "1")※
> ここで、[DDDD]のCheckBoxを取得しようとしたら
> 同様のNullエラーになりました。

それが、冒頭で私が指摘した

> まず、グリッドの行を追加する場合、明示的に0か1をセットした方がよいです。
> そうでなければ、nullのケースを考慮した方がよいです。

のことになります。

どのようにdataGridViewに行を追加しているか分かりませんが、該当カラムのnullを許さないのであれば、
データバインドならあらかじめこのカラムにバインドされる値は0か1にする必要がありますし、
dataGridView1.Rows.Addを使用して行追加しているのであれば、このカラムに該当する値として
0か1をセットする必要があります。
それを行わなければ、カラムの内容はnullとなりますので、nullを許すのであれば、
該当カラムがnullであることを判定する必要があります。
もし、dataGridViewに行を追加する際に、何らかの値をこのカラムにセットしているのであれば、
その箇所を見せて頂ければと思います。
引用返信 編集キー/
■58355 / inTopicNo.5)  Re[4]: DataGridViewCheckBoxの取得
□投稿者/ みっつ (6回)-(2011/03/31(Thu) 13:31:03)
No58353 (プシケ さん) に返信
> ■No58351 (みっつ さん) に返信
>>その後、
>>if (dataGridView1.Rows[i].Cells["CHECK"].Value.ToString() == "1")※
>>ここで、[DDDD]のCheckBoxを取得しようとしたら
>>同様のNullエラーになりました。
>
> それが、冒頭で私が指摘した
>
>>まず、グリッドの行を追加する場合、明示的に0か1をセットした方がよいです。
>>そうでなければ、nullのケースを考慮した方がよいです。
>
> のことになります。
>
> どのようにdataGridViewに行を追加しているか分かりませんが、該当カラムのnullを許さないのであれば、
> データバインドならあらかじめこのカラムにバインドされる値は0か1にする必要がありますし、
> dataGridView1.Rows.Addを使用して行追加しているのであれば、このカラムに該当する値として
> 0か1をセットする必要があります。
> それを行わなければ、カラムの内容はnullとなりますので、nullを許すのであれば、
> 該当カラムがnullであることを判定する必要があります。
> もし、dataGridViewに行を追加する際に、何らかの値をこのカラムにセットしているのであれば、
> その箇所を見せて頂ければと思います。

なるほど。
行の追加は

DataTable dt = "データベースから取得"
this.dataGridView1.DataSource = dt;

このようにやっています。
カラムの内容がnullということは、
CheckBoxがFalseと同じということですか?

というか・・・

画面が表示された時点は
全てのCheckBoxのValueはnullで、
チェックされたらTrueValueになり、
チェックされた後チェックを外されたらFalseValueになる
という解釈であっていますか?
引用返信 編集キー/
■58358 / inTopicNo.6)  Re[5]: DataGridViewCheckBoxの取得
□投稿者/ プシケ (4回)-(2011/03/31(Thu) 13:39:52)
2011/03/31(Thu) 13:43:05 編集(投稿者)

No58355 (みっつ さん) に返信

> DataTable dt = "データベースから取得"
> this.dataGridView1.DataSource = dt;
>
> このようにやっています。

なるほど。DataTableをバインドしているのですね。
ちなみに、dataGridViewのチェックボックスカラムにバインドされるDataTable dtの列について
・データ型は?
・どのような値が入っているか?
を確認できますでしょうか?
データ型がint系で、値が0か1であれば、チェックボックスカラムにnullが割り当てられないような気がするのですが...
(例えば、dtの対象カラムの値に1が入っていれば、該当のチェックボックスのセルにはチェックがつくと思うのですが)
引用返信 編集キー/
■58359 / inTopicNo.7)  Re[6]: DataGridViewCheckBoxの取得
□投稿者/ みっつ (7回)-(2011/03/31(Thu) 13:45:37)
2011/03/31(Thu) 13:55:43 編集(投稿者)
No58358 (プシケ さん) に返信
> 2011/03/31(Thu) 13:42:15 編集(投稿者)
>
> ■No58355 (みっつ さん) に返信
>
>>DataTable dt = "データベースから取得"
>>this.dataGridView1.DataSource = dt;
>>
>>このようにやっています。
>
> なるほど。DataTableをバインドしているのですね。
> ちなみに、dataGridViewのチェックボックスカラムにバインドされるDataTable dtの列について
> ・データ型は?
> ・どのような値が入っているか?
> を確認できますでしょうか?
> データ型がintなどの数値系で、値が0か1であれば、チェックボックスカラムにnullが割り当てられないような気がするのですが...
> (例えば、dtの対象カラムの値に1が入っていれば、該当のチェックボックスのセルにはチェックがつくと思うのですが)

チェックボックスの値はデータベースから持ってきたものではないです。
表示したときは、必ず最初は全てのチェックがついていない状態で、
そこからユーザーがチェックをつけたり消したりしているだけです。
チェックボックスの状態は保持していないということです。

追記
データベースに最初から
データ型がintで、
値が0で設定しておいたほうがいいのでしょうか?
引用返信 編集キー/
■58360 / inTopicNo.8)  Re[5]: DataGridViewCheckBoxの取得
□投稿者/ プシケ (5回)-(2011/03/31(Thu) 13:54:14)
No58355 (みっつ さん) に返信
あと、DataGridViewCheckBoxのFalseValueとTrueValueに設定されている内容(0, 1)が数値として設定されているか、
文字列として設定されているかも確認した方がよいです。
(デザイナでこれらプロパティを設定している場合、Designer.csを直接見た方がいいです。)
もしかしたら、FalseValueとTrueValueに設定されている内容が"0","1"のように文字列だった場合、
DataTable dt内の値が数値との比較ができずにnullがセットされる可能性もあるのではないかと。
引用返信 編集キー/
■58361 / inTopicNo.9)  Re[7]: DataGridViewCheckBoxの取得
□投稿者/ プシケ (6回)-(2011/03/31(Thu) 14:01:01)
2011/03/31(Thu) 14:02:32 編集(投稿者)

No58359 (みっつ さん) に返信
> チェックボックスの値はデータベースから持ってきたものではないです。

それであれば明示的に値をセットしなければ、チェックボックスセルの値はnullだと思います。

例えば、データバインドを行わずに、単純に空行を追加するためにdataGridView.Rows.Add();を行ったとき、
追加されたチェックボックスのセルの値はnullになっているはずです。
(同様に、テキストボックスのセルの値もnullなのではないでしょうか。)

また、nullであればチェックボックスのチェックはついていませんので、明示的に
チェックボックスセルに0 or 1の値を入れないのであれば、
チェックなし・・・nullまたは0
チェックあり・・・1
と判断するしかないでしょう。
引用返信 編集キー/
■58362 / inTopicNo.10)  Re[6]: DataGridViewCheckBoxの取得
□投稿者/ みっつ (8回)-(2011/03/31(Thu) 14:01:31)
No58360 (プシケ さん) に返信
> ■No58355 (みっつ さん) に返信
> あと、DataGridViewCheckBoxのFalseValueとTrueValueに設定されている内容(0, 1)が数値として設定されているか、
> 文字列として設定されているかも確認した方がよいです。
> (デザイナでこれらプロパティを設定している場合、Designer.csを直接見た方がいいです。)
> もしかしたら、FalseValueとTrueValueに設定されている内容が"0","1"のように文字列だった場合、
> DataTable dt内の値が数値との比較ができずにnullがセットされる可能性もあるのではないかと。

this.Column1.FalseValue = "0";
this.Column1.TrueValue = "1";
となっていました。

先ほど追記したのですが
データベースに最初から
データ型がintで、
値が0で設定しておいたほうがいいのでしょうか?

少し変えて・・・
データ型がcharacter varying(1)で、
値が0で設定しておいたほうがいいのでしょうか?

引用返信 編集キー/
■58363 / inTopicNo.11)  Re[7]: DataGridViewCheckBoxの取得
□投稿者/ プシケ (7回)-(2011/03/31(Thu) 14:09:34)
No58362 (みっつ さん) に返信
入れ違いになりスミマセン。

> this.Column1.FalseValue = "0";
> this.Column1.TrueValue = "1";

であるならば、

> 少し変えて・・・
> データ型がcharacter varying(1)で、
> 値が0で設定しておいたほうがいいのでしょうか?

文字型系の列をdtに用意した方がよいと思います。

しかしながら、入れ違いになりましたが、No.58361 に記載した通り、

> チェックなし・・・nullまたは0
> チェックあり・・・1

と判断することに問題がなければ、これでもいいのかと。
引用返信 編集キー/
■58364 / inTopicNo.12)  Re[8]: DataGridViewCheckBoxの取得
□投稿者/ みっつ (9回)-(2011/03/31(Thu) 14:27:57)
No58363 (プシケ さん) に返信
> ■No58362 (みっつ さん) に返信
> 入れ違いになりスミマセン。
>
>>this.Column1.FalseValue = "0";
>>this.Column1.TrueValue = "1";
>
> であるならば、
>
>>少し変えて・・・
>>データ型がcharacter varying(1)で、
>>値が0で設定しておいたほうがいいのでしょうか?
>
> 文字型系の列をdtに用意した方がよいと思います。
>
> しかしながら、入れ違いになりましたが、No.58361 に記載した通り、
>
>>チェックなし・・・nullまたは0
>>チェックあり・・・1
>
> と判断することに問題がなければ、これでもいいのかと。

何度もありがとうございます。

if ((dataGridView1.Rows[i].Cells["CHECK"].Value == null) || (dataGridView1.Rows[i].Cells["CHECK"].Value.ToString() == "0"))
{
MessageBox.Show(dataGridView1.Rows[i].Cells["NAME"].Value.ToString());
}
これで考えていた動作が出来ました。
次回また機会があれば
文字列型の列をdtに用意してやってみたいと思います。

本当にありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -