2017-04-03 64 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; 

這應該只返回漢斯的結果,但對於我給出了結果: Hans和Ludo。

如果我對'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(ARG1,ARG2,ARG3)',只是[DatView.AddNew()](https://msdn.microsoft過載.COM/EN-US /庫/ system.data.dataview.addnew(v = vs.110)的.aspx)。你是否在不同的命名空間中重寫了這個方法? – djv

+0

當填充數據表而不是dataView,然後從填充的DataTable創建數據視圖時,它可以工作。 – Chevalric

+0

@djv是的,我很抱歉,這是一個函數,我用它不必自己分配每列。相反,我做了一個擴展,循環參數分配值。 – Chevalric

回答

0

有一個例外,這人似乎得到

數據表之前,必須先設置爲使用數據視圖

(我建議你把在搜索引擎)

雖然你沒有得到異常,y你應該遵循這個順序。

幸運的是,在DataView之前設置DataTable可以用較少的代碼完成,並且沒有擴展方法。

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

相關問題