將一個有層級關級的數據表按父子關係進行排序整理并返回

我們在很多時候,都要顯示TreeView或TreeGrid. 像jqGrid這種控件可以顯示TreeGrid.
但是jqGrid要想顯示正確,必須在傳遞給它數據之前,要將數據集按父子關係排序好。即:

ID|ParenetID|value
-------------------
1 |0        |....
2 |1        |....
3 |2        |....
4 |1        |....

 1 private void button1_Click(object sender, EventArgs e)
 2         {
 3             DataSet ds = new DataSet();
 4 
 5             DataTable dt = new DataTable();
 6 
 7             dt.Columns.AddRange(new DataColumn[] 
 8             {
 9                 new DataColumn("SysID"),
10                 new DataColumn("ParentSysID") ,
11                 new DataColumn("SomeValue") ,
12                 new DataColumn ("depth"),
13                 new DataColumn ("seqNo",typeof(int))
14             }) ;
15 
16             DataRow dr = dt.NewRow();
17             dr[0] = "1";
18             dr[1] = "0";
19             dr[2] = "value";
20             dr[3] = "0";
21             dr[4] = 1;
22             dt.Rows.Add(dr);
23 
24             dr = dt.NewRow();
25             dr[0] = "2";
26             dr[1] = "1";
27             dr[2] = "value";
28             dr[3] = "1";
29             dr[4] = 3;
30             dt.Rows.Add(dr);
31 
32             dr = dt.NewRow();
33             dr[0] = "3";
34             dr[1] = "1";
35             dr[2] = "value";
36             dr[3] = "1";
37             dr[4] = 2;
38             dt.Rows.Add(dr);
39 
40             dr = dt.NewRow();
41             dr[0] = "4";
42             dr[1] = "2";
43             dr[2] = "value";
44             dr[3] = "2";
45             dr[4] = 1;
46             dt.Rows.Add(dr);
47 
48             dr = dt.NewRow();
49             dr[0] = "5";
50             dr[1] = "0";
51             dr[2] = "value";
52             dr[3] = "0";
53             dr[4] = 10;
54             dt.Rows.Add(dr);
55 
56             dr = dt.NewRow();
57             dr[0] = "6";
58             dr[1] = "0";
59             dr[2] = "value";
60             dr[3] = "0";
61             dr[4] = 5;
62             dt.Rows.Add(dr);
63 
64             dr = dt.NewRow();
65             dr[0] = "7";
66             dr[1] = "5";
67             dr[2] = "value";
68             dr[3] = "1";
69             dr[4] = 1;
70             dt.Rows.Add(dr);
71 
72             DataTable dt1 = dt.Clone();
73             var d = dt.AsEnumerable().Min(m => m.Field<string>("depth"));
74             var a = dt.AsEnumerable().Select(m => { return new {sysid = m.Field<string>("sysID"),seqno = m.Field<int>("seqNo"), depth = m.Field<string>("depth") }; }).OrderBy(k => k.depth);
75             var c = a.First().depth;
76             var k1 = a.First().sysid;
77 
78             RecrusionLook<string,string>(dt, dt1, d, default(string));
79 
80         }
81 
82         private void RecrusionLook<T,K>(DataTable source, DataTable target, T depth, K parentSysID)
83         {
84             var result = from r in source.AsEnumerable()
85                          where (r.Field<T>("depth").Equals(depth) || depth == null || depth.Equals(default(T))) && (r.Field<K>("ParentSysID").Equals(parentSysID) || parentSysID == null  || parentSysID.Equals(default(K)))
86                          orderby r.Field<int>("seqNo")
87                          select r;
88 
89             //result.Select(i => { target.ImportRow(i); RecrusionLook(source, target, "", i.Field<string>("sysID")); return; });
90             foreach (var row in result)
91             {
92                 target.ImportRow(row);
93                 RecrusionLook<T, K>(source, target, default(T), row.Field<K>("sysID"));
94             }
95 
96         }
View Code


 

原文地址:https://www.cnblogs.com/sdikerdong/p/3359346.html