2017-04-03 12 views
2

dataView.RowFilterを使用する場合、私は常にデータセットの最後の要素を含むフィルタ結果を取得します。DataViewのrowfilterには常に最後のセットが含まれます

private TestClass[] items = 
{ 
    new TestClass{name = "Hans", age = 10 }, 
    new TestClass{name = "Bert", age = 5 }, 
    new TestClass{name = "Gerda", age = 41 }, 
    new TestClass{name = "Dolf", age = 73 }, 
    new TestClass{name = "Ludo", age = 35 }, 
}; 

データビューの作成:フィルタとデータソースを設定

DataTable dataTable = new DataTable(); 
dataTable.Columns.Add("Name", typeof(string)); 
dataTable.Columns.Add("Age", typeof(int)); 
dataTable.Columns.Add("TestItem", typeof(TestClass)); 
DataView dataView = new DataView(dataTable); 

foreach(var item in items) 
{ 
    dataView.AddNew(item.name, item.age, item); 
} 

を:

は、私がテストデータセットを持って

dataView.RowFilter = "[Name] = 'Hans'"; 
comboBox1.DisplayMember = "Name"; 
comboBox1.ValueMember = "TestItem"; 
comboBox1.DataSource = dataView; 

これは結果としてではなくのためだけハンスを返す必要があります私は結果を与える: ハンスとルード。

「Ludo」をフィルタリングすると「Ludo」のみになります。 なぜ最後の要素も常に返すのですが、フィルタリングされたセットだけが返されるようにするにはどうすればよいですか?

-edit他の人が取得するように見える例外があり

public static class DataViewExtensions 
{ 
    public static DataRowView AddNew(this DataView dataView, params object[] parameters) 
    { 
     DataRowView dataRowView = dataView.AddNew(); 

     int index = 0; 
     foreach (var parameter in parameters) 
     { 
      dataRowView[index++] = parameter; 
     } 

     return dataRowView; 
    } 
} 
+0

私はあなたのコードをテストしていて、私は 'DatView.AddNew(引数1、ARG2、ARG3)'、単に[DatView.AddNew()]のために過負荷を持っていない(https://msdn.microsoft .com/ja-us/library/system.data.dataview.addnew(v = vs.110).aspx)。別の名前空間でこのメソッドをオーバーライドしましたか? – djv

+0

dataViewの代わりにdatatableを埋め込み、塗りつぶしたDataTableからdataviewを作成すると、それは機能します。 – Chevalric

+0

@djvええ、それは自分で各列を割り当てる必要がないために使用する関数です。代わりに、値を割り当てるためにパラメータをループする拡張機能を作成しました。 – Chevalric

答えて

0

のDataTableは

は(私はあなたがいることを入れてお勧めのDataView

を使用する前に設定する必要があります検索エンジン)

例外はありませんが、yこの順序に従うべきです。

幸いにも、DataViewの前にDataViewを設定するのは、少ないコードで拡張メソッドを使用しないで行うことができます。

TestClass[] items = 
{ 
    new TestClass{name = "Hans", age = 10 }, 
    new TestClass{name = "Bert", age = 5 }, 
    new TestClass{name = "Gerda", age = 41 }, 
    new TestClass{name = "Dolf", age = 73 }, 
    new TestClass{name = "Ludo", age = 35 }, 
}; 

DataTable dataTable = new DataTable(); 
dataTable.Columns.Add("Name", typeof(string)); 
dataTable.Columns.Add("Age", typeof(int)); 
dataTable.Columns.Add("TestItem", typeof(TestClass)); 

// set up the DataTable first 
foreach (var item in items) 
{ 
    dataTable.Rows.Add(item.name, item.age, item); 
} 

// then use the DataView 
DataView dataView = new DataView(dataTable); 

dataView.RowFilter = "[Name] = 'Hans'"; 

comboBox1.DisplayMember = "Name"; 
comboBox1.ValueMember = "TestItem"; 
comboBox1.DataSource = dataView; 
+0

あなたの明確な説明と研究をいただきありがとうございます。これは物事をクリアする。 – Chevalric

関連する問題