2017-05-23 1 views
0

다음은 전체 쿼리입니다.데이터에 대한 특정 클래스없이 IcollectionView Filter를 사용하는 방법

DataGrid가있는 WPF 응용 프로그램이 있습니다. Datagrid는 자동 생성 열이있는 데이터베이스에서 데이터를 가져온 후에 IcollectionView에 바인딩됩니다. 데이터를 바인딩하거나 autogeneratingcolumn 메서드에서 Excel 같은 필터 팝업을 사용하여 헤더 템플릿을 만듭니다.

사용자가 해당 열 머리글을 클릭하면 Excel의 필터와 동일한 팝업이 나타납니다. 사용자가 값을 선택/선택 취소하고 확인을 클릭하면 사용자 선택에 따라 데이터가 필터링됩니다.

그게 내가 IcollectionView 필터 기능을 사용하는 줄 알았는데. 그러나 모든 필터 솔루션은 데이터를 필터링하는 클래스를 사용하고 있습니다. 같은 아래의 URL에서 (TraceDataItem 클래스를 사용할지고 있습니다) - 데이터 그리드의 자동 생성 열이 참으로 나는 고정 된 클래스를 가질 수 없습니다 데이터가 아무것도 할 수있다

Filtering ObservableCollection with ICollectionView

. 모든 예제에서 언급 한 것처럼 고정 클래스가없는 데이터에이 필터 기능을 사용할 수있는 방법이 있습니까?

설명이 필요한 경우 투표를하지 말고 질문에 대해 알려주십시오. 코드를 추가

이 내가

var tempCollection = (from c in CurrentDistictValues where c.IsChecked == true select c); 
        var val = from c in tempCollection select c.Name; 
        List<object> itemsChecked = new List<object>(); 
        itemsChecked = val.ToList(); 
        string s = String.Join("','", itemsChecked); 
        StringBuilder t = new StringBuilder(s); 
        t.Append("'"); 
        t.Insert(0, "'"); 
        s = t.ToString(); 

의 쉼표로 구분하여 사용자가 선택한 모든 값을 가질 것이다 필터 popup-에서 사용자로부터 확인/체크되지 않은 값을 얻기 위해 사용하고 무엇 을 used- 있도록 동일의 RowFilter의 DataView를 적용 할 수있다 : -

itemSource.RowFilter = "[" + columnName + "]" + " " + " IN " + "(" + s + ")"; 

- itemSource 존재 & 코드 열 이름 DataView를 우리가 적용되는 건물은이다 필터.

그래서 지금 IcollectionView를 ItemSource로 사용한다면 어떤 접근 방식을 사용해야합니까?

+0

필터링 할 속성을 어떻게 알 수 있습니까? – mm8

+0

@ mm8 머리글 클릭에서 열 이름을 가져옵니다. 참고하시기 바랍니다, 나는 작은 데이터에 대해 잘 작동하는 dataview.RowFilter를 사용하여 다른 방법도 구현했지만 성능은 대용량 데이터의 경우 매우 열악합니다. 그래서 IcollectionView 필터 기능에 대한 링크를 찾았을 때 솔루션을 찾아 보았습니다. –

+0

리플렉션을 사용하여 ICollectionView를 필터링 할 수 있어야합니다. 지금까지 작성한 코드를 게시하십시오. – mm8

답변

0

ICollectionView에 표시된 요소 유형을 모르는 경우 리플렉션을 사용하여 계속 필터링 할 수 있습니다. 다음과 같은 내용 :

string propertyName = "Name"; //property to filter by 
string valueToCompareAgainst = "x"; 
ICollectionView view = ...; 
view.Filter = (obj) => 
{ 
    Type type = obj.GetType(); 
    System.Reflection.PropertyInfo pi = type.GetProperty(propertyName); 
    if(pi != null) 
    { 
     object value = pi.GetValue(obj); 
     return value.Equals(valueToCompareAgainst); 
    } 
    return false; 
}; 
+0

valueToCompareAgainst 값이 여러 개인 경우 어떻게해야합니까? "x, y, z"와 같습니다. –

+0

똑같은 일입니다. 즉, 각 속성에 대해 PropertyInfo를 가져 와서 위에서 설명한대로 각각을 비교해야합니다. – mm8

+0

위 코드를 사용하여 DataGrid의 한 열에 대한 데이터를 필터링 할 수있었습니다. 여러 열의 문제가 있습니다. IcollectionView에서 첫 번째 필터를 수행했다면 다음 필터에서 데이터를 필터링했거나 다시 완전한 데이터가 될 것입니다. –

관련 문제