如何从Sqlite数据库加载数据实现灵活树形菜单界面及节点遍历方法
这几天一直在思考做一个树形菜单界面,并且要从数据库中加载内容,接着就有了后续的文章。首先从视频来看看效果吧。(TreeView 能够自己对节点进行编辑,然而这些节点都是最初就写好的,不够具有灵活性)

实现步骤
主要代码如下
这里的数据库是Sqlite数据库。表格结构如下图
这里主要起示意作用,只搭建了两列。其中一列是节点名称,另一列是节点层级。
程序源码:
节点遍历方法是通过 for 循环来实现的。并且这里的 dt 是从数据库返回的数据集。
//绑定TrreViewprivate void InitModuleTree(DataTable dt){//清空treeview上所有节点this.tree_Role.Nodes.Clear();int[] gen = new int[dt.Rows.Count]; //用于存储父节点Tagint[] zi = new int[dt.Rows.Count]; //用于存储子节点Tagfor (int i = 0; i < gen.Length; i++){string zhi = dt.Rows[i][1].ToString();//获取节点Tag值 eg:1-2if (zhi.Length > 1) //表示是子节点 eg:1-2{gen[i] = int.Parse(zhi.Substring(0, zhi.IndexOf('-')));zi[i] = int从 zhi 中找到其索引位置,然后截取该索引位置之后的部分并进行解析。'-') + 1));}else //表示是根节点 eg:2{//将所有父节点加到treeview上zi[i] = int.Parse(zhi);TreeNode nodeParent = new TreeNode();nodeParent 的 Tag 属性被赋值为 (zi[i]).ToString() 。nodeParent.Text = dt.Rows[i][0].ToString();//填充父节点名称tree_Role 的节点添加了 nodeParent 这个节点。}}bindChildNote(dt, gen, zi);}//绑定子节点private void bindChildNote(DataTable dt, int[] gen, int[] zi){for (int i = 0; i < gen.Length; i++){if (gen[i] != 0 && zi[i] != 0) //便利所有节点,找到所有子节点{TreeNode childNode = new TreeNode();foreach (TreeNode item in tree_Role.Nodes) //便历treeview上所有父节点{if语言风格:保持原文风格,去掉最前面的序号,把//找到当前子节点的父节点{childNode 的 Tag 属性被设置为 zi[i] 转换后的字符串。childNode.Text = dt.Rows[i][0].ToString();//填充子节点名称item.Nodes.Add(childNode);}}}}tree_Role.ExpandAll(); //展开整棵树}
你可能想看: