2016-11-30 77 views
0

我正在使用dapper,asp.net web api並希望在treeview中顯示數據。爲此,我有兩個模型,目前看起來像下面。 數據庫表映射:如何在C#中構建嵌套treeview?

public class Zones 
{ 
    public string model_zone_id { get; set; } 
    public string model_zone_name { get; set; } 
    public string model_zone_parent_id { get; set; } 
} 

查看映射(這種模式將通過視圖被消耗)

public class Zones 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public List<Zones> Childrens { get; set; } 
} 

小巧玲瓏的查詢:

var zones = await 
      con.QueryAsync<Zones>(
      sql: AdvisorQueries.AllZones, 
      commandType: CommandType.Text); 

數據庫表:

enter image description here

如何在使用LINQ的treeview模型中將其轉換?

回答

0

創建在區域模型

public void PrintPretty(string indent, bool last) 
    { 
     Console.Write(indent); 
     if (last) 
     { 
      Console.Write("|-"); 
      indent += " "; 
     } 
     else 
     { 
      Console.Write("|-"); 
      indent += "| "; 
     } 
     Console.WriteLine(Name); 

     for (int i = 0; i < Children.Count; i++) 
      Children[i].PrintPretty(indent, i == Children.Count - 1); 
    } 

然後重命名區模型類中的方法來副區域

public class childzones 
{ 
    public string model_zone_id { get; set; } 
    public string model_zone_name { get; set; } 
    public string model_zone_parent_id { get; set; } 
} 

因爲類名不應當等於用於產生treeNode節點。

您可以使用同一個區級這樣

public class Zones 
    { 

     public Zones() 
     { 
      Children = new List<Zones>(); 
     } 
     public string Id { get; set; } 
     public string Name { get; set; } 
     public List<Zones> Children { get; set; } 

     public void PrintPretty(string indent, bool last) 
     { 
      Console.Write(indent); 
      if (last) 
      { 
       Console.Write("|-"); 
       indent += " "; 
      } 
      else 
      { 
       Console.Write("|-"); 
       indent += "| "; 
      } 
      Console.WriteLine(Name); 

      for (int i = 0; i < Children.Count; i++) 
       Children[i].PrintPretty(indent, i == Children.Count - 1); 
     } 

    } 

最後你會得到一個模型這樣

static void Main(string[] args) 
     { 

      Zones node1 = new Zones() 
      { 
       Name = "Root", 
       Id = "1", 
       Children = { 
        new Zones() { 
         Name = "BranchA", 
         Id = "1", 
         Children = { 
          new Zones() { 
           Name = "Siblings1", 
           Id = "1", 
           Children = { 
            new Zones() { 
             Name = "subChild1", 
             Id = "1", 
             Children = { 
             } 
            }, 
            new Zones() { 
             Name = "subchild2", 
             Id = "1", 
             Children= { 
             } 
            } 
           } 

          }, 
          new Zones() { 
           Name = "Siblings2", 
           Id = "1", 
           Children = { 

           } 
          } 
         } 
        }, 
        new Zones() { 
         Name = "BranchB", 
         Id = "1", 
         Children = { 
          new Zones() { 
           Name = "Sibilings1", 
           Id = "1", 
           Children = { 

           } 
          } 
         } 
        } 
       } 
      }; 
      node1.PrintPretty("", true); 

} 

輸出

|-Root 
    |-BranchA 
    | |-Siblings1 
    | | |-subChild1 
    | | |-subchild2 
    | |-Siblings2 
    |-BranchB 
    |-Sibilings1 
0

你並不需要一個TreeView 。您可以使用數據表與第一列是一個布爾

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      dataGridView1.AllowUserToAddRows = false; 

      List<Zones> zones = new List<Zones>() { 
       new Zones() { 
        Id = "AllZone", Name = "AllZone", Childrens = new List<Zones>() { 
         new Zones() { 
          Id = "SZ001", Name = "All Stores", Childrens = new List<Zones>() { 
           new Zones() { Id = "1", Name = "Express", Childrens = null}, 
           new Zones() { Id = "2", Name = "National", Childrens = null}, 
           new Zones() { Id = "3", Name = "Metro", Childrens = null}, 
           new Zones() { Id = "4", Name = "Scotland National", Childrens = null}, 
           new Zones() { Id = "5", Name = "Scotland Express", Childrens = null}, 
           new Zones() { Id = "6", Name = "UK London Metro", Childrens = null} 
          } 
         } 
        } 
       } 
      }; 

      DataTable dt = new DataTable(); 
      dt.Columns.Add("Enabled", typeof(Boolean)); 
      dt.Columns.Add("ID", typeof(string)); 
      dt.Columns.Add("Name", typeof(string)); 
      dt.Columns.Add("Parent", typeof(string)); 
      dt.Columns["Parent"].AllowDBNull = true; 

      Zones.GetChildren(dt, zones, "NULL"); 
      dt = dt.AsEnumerable().OrderBy(x => x.Field<string>("ID")).CopyToDataTable(); 
      dataGridView1.DataSource = dt; 
     } 
    } 
    public class Zones 
    { 
     public string Id { get; set; } 
     public string Name { get; set; } 
     public List<Zones> Childrens { get; set; } 

     public static void GetChildren(DataTable dt, List<Zones> children, string parent) 
     { 
      foreach (Zones child in children) 
      { 
       dt.Rows.Add(new object[] { false, child.Id, child.Name, parent }); 
       if (child.Childrens != null) 
       { 
        GetChildren(dt, child.Childrens, child.Id); 
       } 
      } 
     } 

    } 
} 

enter image description here