DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Form上のDataGridViewに表示した値が消える

環境/言語:[Win7, .NET 3.5]
分類:[.NET]

Form上にDataGridViewを配置しました。厳密には、データソースの型付きデータセットをフォームにドロップしたらDataGridViewが配置されました。

ボタン(btn1)を1つと、テキストボックス(txt1)を1つ配置しました。
テキストボックスに何も入っていなければ全件検索。テキストボックスに何か入っていれば、それをキーにデータテーブル内を検索するというコードを書きました。

DataRow[] foundRows;
if(this.txt1.text == "")
{
this.testTableAdapter.Fill(this.testDataSet.test);
}
else
{
foundRows = testDataSet.test.Select("id LIKE " + "'%" + txt1.text + "%'");
testBindingSource.DataSource = foundRows; //表示
}


テーブルには、下記のようなフィールドがあります。
id,name,flag
1,kondo,0
2,oota,1
3,suzuki,1

全件検索する時は全てのデータがDataGridViewに表示されます。
テキストボックスにidを入力し、例えば「2」と検索すると、
2,,0

のように、何故かnameの列が表示されません。
そして、再度全件検索すると全てのデータが表示されます。

コード中に、this.DataGridView.update();

としても結果はかわりませんでした。どこが原因かお教え頂けませんでしょうか?よろしくお願いします。
■No32391に返信(masakazuさんの記事)
> DataRow[] foundRows;
> if(this.txt1.text == "")
> {
> this.testTableAdapter.Fill(this.testDataSet.test);
> }
> else
> {
> foundRows = testDataSet.test.Select("id LIKE " + "'%" + txt1.text + "%'");
> testBindingSource.DataSource = foundRows; //表示
> }

if の条件が false になって制御が else に飛んだ時は testDataSet.test の
中身がないからではないのですか? ただ、2,,0 が表示されると言うのは解せ
ませんが・・・
WebSurfer さん

foundRowsのItemArrayを見てもしっかりデータが入っているので、中身が無いという事はありませんでした。

データが全く無ければ理解できたのですが、2,,0 のように抜けるデータがある為、頭がハテナになってしまいました。

ご回答ありがとうございます。もう少し調べてみます。
■No32393に返信(masakazuさんの記事)

> foundRowsのItemArrayを見てもしっかりデータが入っているので、中身が無いという事はありませんでした。
>
> データが全く無ければ理解できたのですが、2,,0 のように抜けるデータがある為、頭がハテナになってしまいました。

foundRowsのItemArrayを見てもしっかりデータが入っているので、中身が無いという事はありませんでした。

ということは、最初の質問に書かれているコード以外の場所(Form.Load イベントのハンドラ?)
で、DataTable は Fill 済みということのようですね。

そして、testDataSet.test.Select メソッドで取得した foundRows には「しっかりデータが入っ
ている」ということですが、それは間違いないでしょうか?

testBindingSource.DataSource = foundRows; のように設定した場合、DataGridView に表示する
データは、直接 foundRows から取得するのではなく、型付 DataTable (多分 testDataTable)
に定義されている型付 DataRow(多分 testRow)のアクセサ(多分 id, name, flag)を使って型
付 DataTable のインスタンスから取得するはずです。

そこを調べてみてはいかがですか?
> テキストボックスにidを入力し、例えば「2」と検索すると、
> 2,,0
>
> のように、何故かnameの列が表示されません。

nameの列が表示されないのであれば、「2,,1」となるのでは?

提示されたコードのtestTableAdapterとtestDataSetとtestBindingSourceの関連が
全く不明なので、それ以外にも原因がありそうなので、見当違いになるかも知れませんが、
BindingSourceのResetBindingsをしないとDataGridViewに反映されないのではないでしょうか?
WebSurfer さん

DataTableのFillはフォームに配置したbtn1というボタンをクリックした時におこなっています。
testDataSet.test.SelectのfoundRowsには間違いなくデータが入っています。何回も確認しました。

>定義されている型付 DataRow(多分 testRow)のアクセサ(多分 id, name, flag)を使って型付 DataTable のインスタンスから取得するはずです。

こちらさっそく確認してみます。ご回答ありがとうございます。
クッキーさん

>nameの列が表示されないのであれば、「2,,1」となるのでは?

おっしゃるとおりです。間違っていました。

ResetBindingsを試してみましたが、正しく動きませんでした・・・


とりあえず、DataTable内で検索をするのをやめて、1回1回データベースに情報を読み取りに行くという処理にかえました。
これだと上手くいくので問題ないのですが、パフォーマンスがちょっと悪いので、もう少しDataTable内での検索がなんとかならないか調べてみたいと思います。
ありがとうございました。
■No32402に返信(masakazuさんの記事)

> DataTableのFillはフォームに配置したbtn1というボタンをクリックした時におこなっています。

ホントにそうですか? 一番最初の質問に書いてあったコードが btn1 クリック
で走るコードですよね? そのコードだけだとすると if の条件が true になら
ないと Fill されませんが?

> 厳密には、データソースの型付きデータセットをフォームにドロップしたらDataGridViewが配置されました。

そういう操作を行うと、Form.Load イベントのハンドラが自動生成されて、その
中に Fill するコードができるはずですけど?????
>そういう操作を行うと、Form.Load イベントのハンドラが自動生成されて、その中に Fill するコードができるはずですけど?????

Form.LoadイベントにFillするコードができましたが、ロード時にはDGVに表示されたくなかったので、btn1をクリックするとFillされるように書き換えました。

ロードイベントにFillするコードも試しましたが、結果は同じでした。


最初に提示させて頂いたコードとは若干違いますが、書いたこーどは下記のようになります。


bool readFlag = false;

//ボタンをクリックすると、
private void btn1_Click(object sender, EventArgs e)
{
if (readFlag)
{
if(this.txt1.text =="")
{
testBindingSource.DataSource = testDataSet.test;
}
else
{
readFlag = true;
foundRows = testDataSet.test.Select("id LIKE " + "'%" + txt1.text + "%'");
testBindingSource.DataSource = foundRows; //表示
}
}
}

DOBON.NET | プログラミング道 | プログラミング掲示板