现在单表树结构如下
ID PID NAME
1 0 A
2 1 B
3 4 C
4 7 D
5 2 E
6 4 F
7 2 G
8 5 H
9 0 I
10 8 J
自定义orderTree函数,对以上数据进行排序,PID(父节点)等于0为根节点, 排序结果应为 A-B-E-H-J-G-D-C-F-I 排序规则: 从PID为0的节点开始排序,查找其子节点,直到遍历所有数据 要求保证算法简单,速度快,树结构可自行建立数据表或存于DATASET中
DataSet Set = new DataSet();
DataTable dt = new DataTable("RoadTree");
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("PID", typeof(int));
dt.Columns.Add("Name", typeof(string));
DataRow row = null;
//初始化四个父类记录
#region 初始化四个父类记录
row = dt.NewRow();
row["ID"] = 1;
row["PID"] = 0;
row["Name"] = "A";
dt.Rows.Add(row);
row = dt.NewRow();
row["ID"] = 2;
row["PID"] = 1;
row["RoadName"] = "B";
dt.Rows.Add(row);
row = dt.NewRow();
row["ID"] = 3;
row["PID"] = 4;
row["Name"] = "C";
dt.Rows.Add(row);
……………………
//以上是将所有的数据存至DataSet数据集中
//以下采用递归算法BindNode,来遍历所有的结点,并将结点绑定到DropDownList中
BindNode(this.DropDownList1, "0", Set);
//-----------BindNode递归算法如下:--------------//
private void BindNode(DropDownList Nds, string pNodeId, DataSet ds)
{
DataView dvTree = new DataView(ds.Tables[0]);
dvTree.RowFilter = "[PID] = " + pNodeId;
foreach (DataRowView Row in dvTree)
{
ListItem tempNode = new ListItem();
tempNode.Value = Row["ID"].ToString();
if (pNodeId != "0")
tempNode.Text = "----" + Row["Name"].ToString();
else
{
tempNode.Text = Row["Name"].ToString();
tempNode.Attributes.Add("style", "background-color: #005A94;color:white;");
}
Nds.Items.Add(tempNode);
//建立该结点的子节点;如果该节点还有其它子节点,就进行递归调用
BindNode(Nds, Row["ID"].ToString(), ds);
}
}