之前写了个WPF(Winform)中动态创建TreeView 的随笔,现在再在此文的基础上整一个LINQ的吧,感觉用LINQ简单多了,看来微软是越来越有意思了,呵呵,下面开始吧……
首先,先来重新创建一个数据库表,这里的数据库表与之前所创建的表有些不同,大家可以自己对比一下。
Code
CREATE TABLE [dbo].[Me_Menu] (
[Menu_Id] [int] IDENTITY (1, 1) NOT NULL ,/**节点ID*/
[Menu_ParentName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,/**父节点名*/
[Menu_ChildName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,/**子节点名*/
[Menu_Order] [int] NULL ,/**//*排序用*/
) ON [PRIMARY]
GO
创建好数据库表后,就是打开数据库连接了,具体的打开方法在这里就不哆嗦了,可参考一下WPF(Winform)中动态创建TreeView 中第二步。
然后,一起来看看其数据的绑定方法吧:
Code
private void BindMenuData()
{
string sql = "Select distinct Menu_ParentName,Menu_ChildName From Me_Menu order by Menu_Order desc";
DataTable menudt = db.GetDbTable(sql);//从数据库中查询出该数据库表,GetDbTable()方法请参见wpf动态创建TreeView中的DBbuild类
//LINQ查询
var menuData = from menu in menudt.AsEnumerable()
group menu by menu.Field<string>("Menu_ParentName"); //按Menu_ParentName来进行分组
TreeNode node;//父节点
TreeNode childnd;//子节点
foreach (var m in menuData) //循环查询
{
node = new TreeNode();
node.Text = m.Key; //获取父节点名
foreach (var mm in m) //在分组中循环查询
{
childnd = new TreeNode();
childnd.Text = mm.Field<string>("Menu_ChildName");//获取了节点名
if (childnd.Text != "")//如果子节点名不为空,则将其加入到其对应的父节点中去
{
node.Nodes.Add(childnd);
}
}
MenuTView.Nodes.Add(node);//将所有节点添加到TreeView中去,其MenuTView为TreeView控件
}
}
最后,在需要的地方直接调用BindMenuData()就可以了。
当然你也可以重写一个带TreeView参数的方法,如:BindMenuData(TreeView MenuTView),来动态创建TreeView。
希望能给大家带来一点帮助……