2017-04-03 21 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 }, 
}; 

DataView를 만들기 : 필터 및 데이터 소스를 설정

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; 

이 결과 만 만 한스을 반환해야 나에게 이것은 결과를 준다 : 한스와 루도.

'루도'를 필터링하면 '루도'만 표시됩니다. 왜 항상 마지막 요소도 반환하며 필터링 된 집합 만 반환하도록하려면 어떻게해야합니까?

-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/ko-us/library/system.data.dataview.addnew (v = vs.110) .aspx). 다른 네임 스페이스에서이 메서드를 재정의 했습니까? – djv

+0

dataView 대신 datatable을 채운 다음 채워진 DataTable에서 dataview를 만들면 작동합니다. – Chevalric

+0

@djv 예. 죄송합니다. 각 열을 스스로 할당 할 필요가없는 함수입니다. 대신 매개 변수를 반복하여 값을 할당하는 확장을 만들었습니다. – Chevalric

답변

0

의 DataTable은

(나는 당신이에 있음을 넣어 제안 DataView를

을 사용하기 전에 설정해야합니다 검색 엔진)

예외는 없지만 y ou는이 명령을 따라야합니다.

다행히 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