2

私はC#と.NETの初心者ですが、次の問題が発生しています(.NET 4.5を使用)。

xmlファイルからのデータを表示する必要がある3つのDataGridViewがあります。各DataGridはその結果をフィルタリングする必要があるため、xmlエントリは3つのDataGridViewに分散されます。

私は次のことを試しました:

DataSet dataSet1 = new DataSet();
dataSet1.ReadXml('some-existing-file.xml');

DataTableCollection tables = dataSet1.Tables;
DataView view1 = new DataView(tables[0]);

BindingSource source1 = new BindingSource();
source1.DataSource = view1;
source1.Filter = "color = 'red'";
gridView1.DataSource = source1;

BindingSource source2 = new BindingSource();
source2.DataSource = view1;
source2.Filter = "color = 'white'";
gridView2.DataSource = source2;

BindingSource source3 = new BindingSource();
source3.DataSource = view1;
source3.Filter = "color = 'blue'";
gridView3.DataSource = source3;

しかし、これは機能しません。3つのGridViewはすべて、最後のフィルター(「青)」を使用します。

XMLは次のようになります(簡略化):

<?xml version="1.0" encoding="utf-8"?>
<collection>
    <entry>
        <color>blue</color>
        <headline>Some headline</headline>
    </entry>
    [...]
</collection>

そして、変更をxmlファイルに書き戻したいときに、同じデータセットを正しい方法でフィルタリングしているだけですか?

4

3 に答える 3

4

3 つのフィルターすべてがビューに適用され、最後のフィルターの結果を示す出力が得られるので、3 つのビューを使用します。うまくいったら、後で改善できます

DataView view1 = new DataView(tables[0]);
DataView view2 = new DataView(tables[0]);
DataView view3 = new DataView(tables[0]);


BindingSource source1 = new BindingSource();
source1.DataSource = view1;
source1.Filter = "color = 'red'";
gridView1.DataSource = source1;

BindingSource source2 = new BindingSource();
source2.DataSource = view2;
source2.Filter = "color = 'white'";
gridView2.DataSource = source2;

BindingSource source3 = new BindingSource();
source3.DataSource = view3;
source3.Filter = "color = 'blue'";
gridView3.DataSource = source3;
于 2012-04-17T10:47:47.813 に答える
2

DataView には、フィルターによって変更されたパブリックに読み取り可能なコレクションがある可能性があります。データ ソースを設定する場合、そのように view1 を指定すると、コピーではなく DataView の参照が提供されます。これは、すべてのフィルターが同じ DataView インスタンス内の同じ表示可能なコレクションを変更していることを意味します (これは、最後のフィルターが機能しているフィルターである理由を説明します)。

フィルタリングのケースごとに、DataView の個別のインスタンス/コピーを作成することをお勧めします。ただし、xml ファイルからロードされた同じデータを引き続き参照するため、これはスコープ内にとどまります。

于 2012-04-17T10:48:39.800 に答える
1

DataView view1 = new DataView(tables[0]);次のように、グリッドビューごとに新しい DataView obj を準備するように変更する必要があります。

DataView view1 = new DataView(tables[0].Copy());
DataView view2 = new DataView(tables[0].Copy());
DataView view3 = new DataView(tables[0].Copy());
于 2012-04-17T10:49:38.007 に答える