2012-09-21 25 views
0

我正在尝试使按以下顺序具有项目的树视图。如何转换为通用代码?

+ Continent 
    + Country 
     + Province 
      + Territory 

而且,我有一个通用类来保存treeView Items数据。

public class TreeViewContinents 
{ 
    public List<TreeViewContinents> Children { get; set; }  
    public TreeViewContinents Parent { get; set; }  
    public string Name { get; set; }  
    public string Content { get; set; } 
} 

数据:基于哪个树形目录项

private readonly List<Dictionary<string, object>> continentsList = new List<Dictionary<string, object>>(); 

/* 
continentsList[0] - "Continent", "Asia" 
        "Country", "Afghanistan" 
        "Province", "Kabul" 
        "Territory", "Bagrami" 
        "Language", "aaa" 
        "Culture", "bbb" 
       . 
       .    
       . 
       . 

continentsList[n] - "Continent", "North America" 
        "Country", "Canada" 
        "Province", "Ontario" 
        "Territory", "Ottawa" 
        "Language", "aaa" 
        "Culture", "bbb 

*/ 

字符串数组需要生成。

var treeViewItemNames = new[] { "Continent", "Country", "Province", "Territory" }; 

代码:

List<object> Continents = this.continentsList.Where(
          p_oDict => p_oDict.ContainsKey(treeViewItemNames[0])) 
          .Select(p_oDict => p_oDict[treeViewItemNames[0]]) 
          .Distinct() 
          .ToList(); 

var topItems = new List<TreeViewContinents>(); 

foreach (object continent in Continents) 
{ 
    var level1Items = new TreeViewContinents { Name = treeViewItemNames[0], Content = continent.ToString() }; 

    List<object> Countries = this.continentsList.Where(
          p_oDict => p_oDict.ContainsKey(treeViewItemNames[0]) 
          && p_oDict.ContainsKey(treeViewItemNames[1]) 
          && p_oDict[treeViewItemNames[0]].Equals(continent) 
          .Select(p_oDict => p_oDict[treeViewItemNames[1]]) 
          .Distinct() 
          .ToList(); 

    Countries.Sort((p_oU1, p_oU2) => string.Compare(p_oU1.ToString(), p_oU2.ToString(), StringComparison.Ordinal)); 
    foreach (object country in Countries) 
    { 
     var level2Items = new TreeViewContinents { Name = treeViewItemNames[1], Content = country.ToString(), Parent = level1Items }; 
     level1Items.Children.Add(level2Items); 

     List<object> Provinces = this.continentsList.Where(
           p_oDict => p_oDict.ContainsKey(treeViewItemNames[0]) 
             && p_oDict.ContainsKey(treeViewItemNames[1]) 
              && p_oDict.ContainsKey(treeViewItemNames[2]) 
              && p_oDict[treeViewItemNames[0]].Equals(continent) 
              && p_oDict[treeViewItemNames[1]].Equals(country)) 
              .Select(p_oDict => p_oDict[treeViewItemNames[2]]).Distinct() 
             .ToList(); 

     Provinces.Sort((p_oU1, p_oU2) => string.Compare(p_oU1.ToString(), p_oU2.ToString(), StringComparison.Ordinal)); 
     foreach (object province in Provinces) 
     { 
      var level3Items = new TreeViewContinents { Name = treeViewItemNames[2], Content = province.ToString(), Parent = level2Items }; 
      level2Items.Children.Add(level3Items); 

      List<object> Territories = this.continentsList.Where(
           p_oDict => p_oDict.ContainsKey(treeViewItemNames[0]) 
             && p_oDict.ContainsKey(treeViewItemNames[1]) 
             && p_oDict.ContainsKey(treeViewItemNames[2]) 
             && p_oDict.ContainsKey(treeViewItemNames[3]) 
             && p_oDict[treeViewItemNames[0]].Equals(continent) 
             && p_oDict[treeViewItemNames[1]].Equals(country) 
             && p_oDict[treeViewItemNames[2]].Equals(province)).Select(
             p_oDict => p_oDict[treeViewItemNames[3]]) 
             .Distinct() 
             .ToList(); 
      Territories.Sort((p_oU1, p_oU2) => string.Compare(p_oU1.ToString(), p_oU2.ToString(), StringComparison.Ordinal)); 
      foreach (object territory in Territories) 
      { 
       var level4Items = new TreeViewContinents { Name = treeViewItemNames[3], Content = territory.ToString(), Parent = level3Items }; 
       level3Items.Children.Add(level4Items); 
      } 
     } 
    } 

    topItems.Add(level1Items); 
} 

在上面的代码,我有四个foreach循环来构建一个TreeView。是否可以编写一个循环来基于该变量treeViewItemNames树视图,以便在将来如果我改变像

var treeViewItemNames = new[] { "Continent", "Country", "Territory" }; 

变量应该产生的TreeView这样

+ Continent 
    + Country 
     + Territory 

思路/建议请。

回答

1

我建议迭代continentsList元素。

var treeViewItemNames = new[] { "Continent", "Country", "Province", "Territory" }; 

    var topItems = new List<TreeViewContinents>(); 


    foreach (var continent in continentsList) 
    { 
     List<TreeViewContinents> currentLevel = topItems; 
     TreeViewContinents parentItem = null; 
     foreach (var sectionTitle in treeViewItemNames) 
     { 
      String value = Convert.ToString(continent[sectionTitle]); 
      TreeViewContinents currentItem = currentLevel.FirstOrDefault(tree => tree.Content == value); 
      if (currentItem == null) 
      { 
       currentItem = new TreeViewContinents { Name = sectionTitle, Content = value }; 
       currentItem.Children = new List<TreeViewContinents>(); 
       if (parentItem != null) 
       { 
        currentItem.Parent = parentItem; 
       } 
       currentLevel.Add(currentItem); 
      } 
      parentItem = currentItem; 
      currentLevel = currentItem.Children; 
     } 
    } 

这段代码的问题在于,在项目不排序,但我们可以结果排序TreeViewContinents列表。下面是递归的方法排序:

public List<TreeViewContinents> SortTreeView(List<TreeViewContinents> treeViewList) 
{ 
    foreach (var item in treeViewList) 
    { 
     if (item.Children.Count > 0) 
     { 
      item.Children = SortTreeView(item.Children); 
     } 
    } 
    return treeViewList.OrderBy(it => it.Content).ToList(); 
} 

您可以使用它后topItems列表已满:

topItems = SortTreeView(topItems); 
+0

排序不工作:(我会尝试修复它 –

+1

是,印刷错误的排序依据放慢参数。return treeViewList.OrderBy(it => it.Content).ToList();固定 –

+0

是的,我也在代码中修复它。 –