數據庫表設計 id int
pid int null
name nvarchar null
#region 綁定TreeView
/// <summary>
/// 綁定TreeView(利用TreeNodeCollection)
/// </summary>
/// <param name="tnc">TreeNodeCollection(TreeView的節點集合)</param>
/// <param name="pid_val">父id的值</param>
/// <param name="id">數據庫 id 字段名</param>
/// <param name="pid">數據庫 父id 字段名</param>
/// <param name="text">數據庫 文本 字段值</param>
private void Bind_Tv(DataTable dt, TreeNodeCollection tnc, string pid_val, string id, string pid, string text)
{
DataView dv = new DataView(dt);//將DataTable存到DataView中,以便於篩選數據
TreeNode tn;//建立TreeView的節點(TreeNode),以便將取出的數據添加到節點中
//以下爲三元運算符,如果父id爲空,則爲構建“父id字段 is null”的查詢條件,否則構建“父id字段=父id字段值”的查詢條件
string filter = string.IsNullOrEmpty(pid_val) ? pid + " is null" : string.Format(pid + "='{0}'", pid_val);
dv.RowFilter = filter;//利用DataView將數據進行篩選,選出相同 父id值 的數據
foreach (DataRowView drv in dv)
{
tn = new TreeNode();//建立一個新節點(學名叫:一個實例)
tn.Value = drv[id].ToString();//節點的Value值,一般爲數據庫的id值
tn.Text = drv[text].ToString();//節點的Text,節點的文本顯示
tnc.Add(tn);//將該節點加入到TreeNodeCollection(節點集合)中
Bind_Tv(dt, tn.ChildNodes, tn.Value, id, pid, text);//遞歸(反覆調用這個方法,直到把數據取完爲止)
}
}
#endregion
我是從中間層直接返回的dataset 數據類型的集合,然後調用的代碼如下:
Operation operate = new Operation();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Bind_Tv(operate.Test().Tables[0], TreeView1.Nodes, null, operate.Test().Tables[0].Columns[0].ToString(), operate.Test().Tables[0].Columns[1].ToString(), operate.Test().Tables[0].Columns[2].ToString());
}
}