2014-03-26 3 views
2

일반적인 결과 집합을 가져 와서 jQuery Dyantree를 사용하여 ASP.NET MVC로 트리 구조로 변환하는 방법을 찾고 있습니다.재귀 속성 사용 ASP.NET/C#

public class GenericResults 
{ 
    public string ClaimId { get; set; } 
    public string DrugName { get; set; } 
    public int PatientId { get; set; } 

    //simulates database call, this could be any type of result set 
    public static List<GenericResults> MockDatabaseCall() 
    { 
     return new List<GenericResults>() 
     { 
      new GenericResults { ClaimId = "abc", DrugName="Drug 1", PatientId=1 }, 
      new GenericResults { ClaimId = "bcd", DrugName="Drug 2", PatientId=1 }, 
      new GenericResults { ClaimId = "def", DrugName="Drug 3", PatientId=1 }, 
      new GenericResults { ClaimId = "fgi", DrugName="Drug 4", PatientId=1 }, 
      new GenericResults { ClaimId = "ijk", DrugName="Drug 5", PatientId=2 }, 
      new GenericResults { ClaimId = "klm", DrugName="Drug 6", PatientId=2 }, 
      new GenericResults { ClaimId = "mno", DrugName="Drug 7", PatientId=2 }, 
      new GenericResults { ClaimId = "pqr", DrugName="Drug 8", PatientId=2 }, 
      new GenericResults { ClaimId = "qrs", DrugName="Drug 9", PatientId=2 }, 
      new GenericResults { ClaimId = "stu", DrugName="Drug 10", PatientId=2 }, 
     }; 
    } 
} 

데이터가 Dynatree 위해에 있어야 구조는 같다 : 내가 좋아하는 테스트 클래스를 가지고

public string Title { get; set; } 
public List<TreeView> Children { get; set; } 
public bool IsFolder 
{ 
    get 
    { 
     return this.Children.Count > 0; 
    } 
} 

이 예에서, 우리는 정말 ClaimId 속성을 필요가 없습니다

, 하지만 이미 나무에 먹이기 위해 작성한 저장 프로 시저를 다시 사용하여 포함시키고 싶습니다. 그룹화 된 내용이 자신의 TreeView 개체가되고 Children 속성이 그룹화 된 값을 가진 모든 레코드가되어야합니다. 지금까지 MockDatabaseCallMethod, 내가 PatientId에 그룹화하면 두 개의 TreeView 개체가 필요합니다. 각 고유 한 PatientId에 하나씩. 이 작업을 재귀 적으로 수행 할 수는 있지만 일부 항목은 나뭇잎 (자식 없음)이 될 것이므로 그 방법은 잘 모르겠습니다. 이상적으로

public class TreeView 
{ 
    public string Title 
    { 
     get; 
     set; 
    } 

    public List<TreeView> Children { get; set; } 

    public bool IsFolder 
    { 
     get 
     { 
      return this.Children.Count > 0; 
     } 
    } 

    //made void for the time being to limit compilation errors 
    public static void ListToTree(string displayName,string groupedOn) 
    { 
     //seed data 
     List<GenericResults> results = GenericResults.MockDatabaseCall(); 

     //"group" on the property passed by the user 
     var query = results.Select(x => x.GetType().GetProperty(groupedOn).GetValue(x,null)).Distinct(); 

     foreach (var i in query) 
     { 
      var treeView = new TreeView(); 
      treeView.Title = displayName; 

      //iterate over results, if object has the property value of what's currently being iterated over 
      //create a new TreeView object for it 
      treeView.Children = results.Where(x => x.GetType().GetProperty(groupedOn).GetValue(x, null) == i) 
             .Select(n => new TreeView 
                { 
                 Title = displayName, 
                 Children = x <--no idea what to do here 
                }); 
     } 
    } 
} 

, 나는이 ToTree 확장 방법을 싶습니다하지만 처음에 나는이에 대한 몇 가지 포인터를 좀하고 싶습니다 : 여기 내 시도입니다. 내가 제대로 이해한다면 감사합니다 :)

+0

을 이해하면 나는, 그러나 확실하지 않다 두 개 이상의 레벨 - 그룹 값의 한 레벨과 "현재"값을 가진 모든 아이템의 다음 레벨? 그렇다면 재귀 적 방법은 잔인합니다. 간단한'results.GroupBy (...) '또는 유사한 것을 사용하여 항목을 그룹으로 분리하십시오. – Sphinxxx

답변

0

는 잘 모르겠어요하지만 그랬다면 나는 다음과 같은 솔루션 제안 :

-) TreeView 변화 public IEnumerable<GenericResults> Children { get; set; }에 재산 public List<TreeView> Children { get; set; }에 있습니다.

는 -) 다음과 같은 한 개 void ListToTree(string displayName 방법을 바꾸기 :

public static List<TreeView> ListToTree(string displayName, string groupedOn) 
{ 
    //seed data 
    List<GenericResults> results = GenericResults.MockDatabaseCall(); 

    List<TreeView> trees = new List<TreeView>(); 

    //"group" on the property passed by the user 
    var query = results.Select(x => x.GetType().GetProperty(groupedOn).GetValue(x, null)).Distinct(); 

    foreach (int i in query) 
    { 
     var treeView = new TreeView(); 
     treeView.Title = displayName; 
     treeView.Children = results.Where(x => ((int)x.GetType().GetProperty(groupedOn).GetValue(x, null)) == i); 

     trees.Add(treeView); 
    } 

    return trees; 
} 

을 내가 정확히 ;-) 그것은 당신의`TreeView`이 없을 것 같은 소리

+0

안녕하세요, Markus입니다. 난 당신의 코드를 시도하고'results.Where ... '라인에 오류가있어 IEnumerable 으로 변환 할 수 없다. – wootscootinboogie

+0

예. 속성을 변경해야하기 때문에 가능합니다 (처음에는 위의 텍스트 참조) –

+0

그리고? 작동 했나요? –