TreeView控件是.NET自带的一个树形菜单控件,使用非常简单。
论坛里有朋友问到了如何通过后台动态加载TreeView,手头正好刚写完一个,顺便贴出来。
不好的地方大家见谅!
应用表结构:
比如一个TreeView的样子是下边的:
仓库
¦--添加仓库
¦--编辑仓库
财务
¦--入账
¦--出帐
查询
那么MenuTitle表保存的就是"仓库,财务,查询"这些根节点
MenuDetail保存的就是"添加仓库,编辑仓库,入账,出帐"这些子节点
它们之间用ID关联
MenuTitle表的结构:
ID{主键}
Title{主节点名称}
MenuDetail表的结构:
Did{主键}
ID{外键}
DTitle{子节点名称}
读取想要加载到TreeView的菜单项目
private void GetDataSet()
... {
try
...{
string constr = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
SqlConnection conn = new SqlConnection(constr);
conn.Open();
string comstr = "Select * from MenuTitle";
SqlDataAdapter sda = new SqlDataAdapter(comstr, conn);
sda.Fill(ds, "table1");
comstr = "Select * from MenuDetail";
sda = new SqlDataAdapter(comstr, conn);
sda.Fill(ds, "table2");
conn.Close();
}
catch (Exception ex)
...{
Console.Write("读取菜单错误");
}
}
加载根节点
private void initRoot(TreeView tnd)
... {
try
...{
DataView dv = new DataView();
TreeNode tmpnd;
dv.Table = ds.Tables["table1"];
foreach (DataRowView drv in dv)
...{
tmpnd = new TreeNode();
tmpnd.Value = drv["ID"].ToString();
tmpnd.Text = drv["Title"].ToString();
tnd.Nodes.Add(tmpnd);
tmpnd.PopulateOnDemand = true;
tmpnd.SelectAction = TreeNodeSelectAction.Expand;
}
}
catch (Exception ex)
...{
Console.Write("读取根节点错误");
}
}
加载子节点
private void AddChildNodes(TreeNode nds)
... {
try
...{
DataView dv = new DataView();
TreeNode tmpnd;
dv.Table = ds.Tables["table2"];
dv.RowFilter = "ID=" + nds.Value.ToString() + "";
foreach (DataRowView drv in dv)
...{
tmpnd = new TreeNode();
tmpnd.Value = drv["Did"].ToString();
tmpnd.Text = drv["DTitle"].ToString();
nds.ChildNodes.Add(tmpnd);
tmpnd.PopulateOnDemand = true;
if (nds.ChildNodes.Count != 0)
...{
tmpnd.SelectAction = TreeNodeSelectAction.Expand;
}
}
}
catch (Exception ex)
...{
Console.Write("读取子节点错误");
}
}
在Page_Load里遍历一下
... {
GetDataSet();
initRoot(TreeView1)
foreach(TreeNode tn in TreeView1.Nodes)
...{
AddChildNodes(tn);
}
}
private void GetDataSet()
... {
try
...{
string constr = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
SqlConnection conn = new SqlConnection(constr);
conn.Open();
string comstr = "Select * from MenuTitle";
SqlDataAdapter sda = new SqlDataAdapter(comstr, conn);
sda.Fill(ds, "table1");
comstr = "Select * from MenuDetail";
sda = new SqlDataAdapter(comstr, conn);
sda.Fill(ds, "table2");
conn.Close();
}
catch (Exception ex)
...{
Console.Write("读取菜单错误");
}
}
加载根节点
private void initRoot(TreeView tnd)
... {
try
...{
DataView dv = new DataView();
TreeNode tmpnd;
dv.Table = ds.Tables["table1"];
foreach (DataRowView drv in dv)
...{
tmpnd = new TreeNode();
tmpnd.Value = drv["ID"].ToString();
tmpnd.Text = drv["Title"].ToString();
tnd.Nodes.Add(tmpnd);
tmpnd.PopulateOnDemand = true;
tmpnd.SelectAction = TreeNodeSelectAction.Expand;
}
}
catch (Exception ex)
...{
Console.Write("读取根节点错误");
}
}
加载子节点
private void AddChildNodes(TreeNode nds)
... {
try
...{
DataView dv = new DataView();
TreeNode tmpnd;
dv.Table = ds.Tables["table2"];
dv.RowFilter = "ID=" + nds.Value.ToString() + "";
foreach (DataRowView drv in dv)
...{
tmpnd = new TreeNode();
tmpnd.Value = drv["Did"].ToString();
tmpnd.Text = drv["DTitle"].ToString();
nds.ChildNodes.Add(tmpnd);
tmpnd.PopulateOnDemand = true;
if (nds.ChildNodes.Count != 0)
...{
tmpnd.SelectAction = TreeNodeSelectAction.Expand;
}
}
}
catch (Exception ex)
...{
Console.Write("读取子节点错误");
}
}
在Page_Load里遍历一下
... {
GetDataSet();
initRoot(TreeView1)
foreach(TreeNode tn in TreeView1.Nodes)
...{
AddChildNodes(tn);
}
}