- PR -

DataGridVewでデータバインディングしている時、主キー、ユニークの重複チェックについて

投稿者投稿内容
キキーヌ
常連さん
会議室デビュー日: 2005/11/25
投稿数: 22
投稿日時: 2007-12-05 19:20
DataViewのRowFilterを使うことでフィルタがかかり表示に影響すると
言うことでしょうか?

今のロジックはRowFilterを設定して確認した後RowFilterにnullを代入して
解除しています。これで動作は問題ないと思っているんですけど
これ以外にも表示に影響を及ぼす場合があるんですか?

DataTable を元に DataView を作るというのはこんな感じ
です(言語が書いていないのでC#で)。
と言うことはDataTableに変更があればDataViewも更新する必要がある
と言うことですよね。これだとDataTableとDataViewの同期漏れが起こる
可能性が高いような気もするんですが・・・?どうなんでしょう?
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-12-05 20:00
引用:

キキーヌさんの書き込み (2007-12-05 19:20) より:

と言うことはDataTableに変更があればDataViewも更新する必要がある
と言うことですよね。これだとDataTableとDataViewの同期漏れが起こる
可能性が高いような気もするんですが・・・?どうなんでしょう?


どうなんでしょう?と聞く前に、試してみれば、結論は出るんじゃないの。

1つのDataTableに対して、RowFilterの異なる、2つDataViewをつくる。
FormにDataGridViewを2つ貼り、各々のDataViewをDataSourceとして割り当てる。
DataTableに対し、レコードを追加・変更・削除して、反応を見る。

そんな、ミニマムコードを作ってみたら。
予想はついてるけど、結果どうなったか、教えてね。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-12-06 08:37
引用:

かずくんさんの書き込み (2007-12-05 20:00) より:

1つのDataTableに対して、RowFilterの異なる、2つDataViewをつくる。
FormにDataGridViewを2つ貼り、各々のDataViewをDataSourceとして割り当てる。
DataTableに対し、レコードを追加・変更・削除して、反応を見る。

そんな、ミニマムコードを作ってみたら。
予想はついてるけど、結果どうなったか、教えてね。


おお、なんかかずくんからナイスフォローが

確かにこれぐらいのことであれば、自分で検証してみるのが一番早いんですよね。
僕も気になったので、ちょっと調べてみました。

僕の場合、前に作った DataTable を DataSource にした DataGridView があったので
もう1個 DataGridView を作って、その DataSource を元の DataTable から作った
DataView にしてみました。
そしてそれぞれの内容を変更して結果を見る、という感じで。

自分では予想通りになりましたが、せっかくなので結果がどうなったか調べて教えて
ください>キキーヌさん
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
キキーヌ
常連さん
会議室デビュー日: 2005/11/25
投稿数: 22
投稿日時: 2007-12-06 13:27
試してみました!!

DataGridViewを3つ作成して以下のコードを書きました
private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("a");
dt.Columns.Add("b");
dt.Columns.Add("c");

dt.Rows.Add(new object[] { 1, 2, 3 });
dt.Rows.Add(new object[] { 4, 5, 6 });
dt.Rows.Add(new object[] { 7, 8, 9 });

DataView dv1 = new DataView(dt);
DataView dv2 = new DataView(dt);

dv1.RowFilter = "a = 1";
dataGridView1.DataSource = dv1;

dv2.RowFilter = "b = 8";
dataGridView2.DataSource = dv2;

dataGridView3.DataSource = dt;
}

結果ですが。
dv1、dv2にデータを(DataGridViewから)追加するとRowFilterの
条件に合うものは表示されますが
条件に合わないデータは表示されませんでした。
でもdtにはデータは追加されていました
これは、追加、変更、削除についても同じ結果になりました。

問題の同期漏れですが、DataView dv1 = new DataView(dt);
このように作成すると同期しないと思ってましたがきちんと同期してました。
dtに変更を加えるとdv1,dv2も影響するのを確認しました。
また、逆にdv1,dv2に変更を加えるとdtにも変更があるのを確認しました。

さて、ぱぴ王子さんの
「DataTable を DataGridView の DataSource として使っている場合など
元の DataTable の表示に影響を及ぼす場合があります。 」
これは
DataView を DataGridView の DataSource として使っている場合は
表示に影響があるのはわかるんですが、DataSourceにDataTableを指定
していても影響はないような気がするんですが・・・。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-12-06 14:01
えーと、ぱぴ王子です ○| ̄|_

引用:

キキーヌさんの書き込み (2007-12-06 13:27) より:

「DataTable を DataGridView の DataSource として使っている場合など
元の DataTable の表示に影響を及ぼす場合があります。 」
これは
DataView を DataGridView の DataSource として使っている場合は
表示に影響があるのはわかるんですが、DataSourceにDataTableを指定
していても影響はないような気がするんですが・・・。


では、dt.DefaultView.RowFilter を設定するコードを追加してみてください。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
キキーヌ
常連さん
会議室デビュー日: 2005/11/25
投稿数: 22
投稿日時: 2007-12-06 14:40
すいません…。
dt.DefaultView.RowFilterに設定すると表示に影響がありました。
DataViewばっかりに目がいって肝心のdt.DefaultView.RowFilterの
ことをすっかり忘れてました。

申し訳ないです。

無事解決したのでこの問題は終了とします
未熟者のキキーヌに長々とお付き合いありがとうございました。

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