2012-09-28 2 views
0

폴더 구조와 유사한 계층 데이터 (폴더는 폴더와 파일을 가질 수 있음)를 표시하는 XamDataGrid가 있습니다. 나는 검색 문자열을 입력하는 그리드 외부에 별도의 TextBox가 있으며 TextChanged에서는 FieldLayouts에 RecordFilters를 적용합니다.XamDataGrid - 부모 자식 계층 데이터 필터링

검색 문자열과 일치하는 파일이있는 경우 부모 폴더 (루트까지)도 표시되어야합니다. 그러나 다른 파일은 보이지 않아야합니다.

디렉터리와 하위 디렉터리 및 하위 파일이 검색 문자열과 일치하지 않는 경우 모두 숨김으로 설정해야합니다.

디렉토리가 검색 문자열과 일치하고 해당 하위 디렉토리와 파일이 일치하지 않으면 해당 기본 디렉토리 만 표시되어야합니다.

부모와 자식 필드 레이아웃 모두에 레코드 필터를 적용하는 것입니다. 부모 디렉토리가 검색과 일치하지 않으면 필드와 일치하는 경우에도 숨겨집니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

1

재귀와 결합 된 Linq로 시작할 수 있습니다.

뭔가 같은 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using rekie; 

namespace System.Collections.Generic 
{ 
    public static class FilterExtension 
    { 
    private static string _criteria; 

    public static IList<Node> FilterBy(this IList<Node> source, string criteria) 
    { 
     _criteria = criteria; 

     var copySource = 
     (from n in source 
     select n).ToList(); 

     foreach (var node in source) 
     { 
     if (node.Offspring != null) 
     { 
      FilterRecursion(node); 
     } 
     } 

     return copySource; 
    } 

    private static void FilterRecursion(Node parent) 
    { 
     foreach (var node in parent.Offspring) 
     { 
     if (node.Offspring != null) 
     { 
      FilterRecursion(node); 
     } 

     node.Visible = node.Text.Contains(_criteria); 
     } 

     parent.Visible = parent.Text.Contains(_criteria) || parent.Offspring.Where(o => o.Visible).Count() > 0; 
    } 
    } 
} 

namespace rekie 
{ 


    class Program 
    { 
    static void Main(string[] args) 
    { 
     var orig = Node.GetSome(); 
     var Results = orig.FilterBy("O.o"); 
    } 
    } 

    public class Node 
    { 
    public string Text { get; set; } 
    public IList<Node> Offspring { get; set; } 
    public bool Visible { get; set; } 

    public static IList<Node> GetSome() 
    { 
     return 
     new List<Node>() 
     { 
      new Node() 
      { 
      Text="Chidori", 
      Offspring=new List<Node>() 
       { 
       new Node(){ Text="Rasengan "} 
       } 
      }, 
      new Node() 
      { 
      Text="Kage Shuriken no Jutsu", 
      Offspring=new List<Node>() 
      { 
       new Node(){Text="Amagumo O.o"} 
      } 
      }, 
      new Node() 
      { 
      Text="Kage Bunshin no Jutsu", 
      Offspring=new List<Node>() 
      }, 
      new Node() 
      { 
      Text="Oiroke no Jutsu", 
      Offspring=new List<Node>() 
      { 
       new Node(){ Text="O.o"} 
      } 
      }, 
      new Node() 
      { 
      Text="Ranshinsho O.o", 
      Offspring=new List<Node>() 
      { 
       new Node(){ Text="Shikotsumyaku" }, 
       new Node(){ Text="Byakugan"} 
      } 
      } 
     }; 
    } 
    } 
}