[C#]TreeView操作汇总
2016-12-05 11:58
169 查看
用到树,自然而然要想到递归
下面的例子是带CheckBox的TreeView,根据Datasource中的isvisible字段来确定是否勾选
加载,构造树形结构:
勾选某个节点CheckBox后的联动处理
最后对比数据源获取更新了的节点,形成sql:
下面的例子是带CheckBox的TreeView,根据Datasource中的isvisible字段来确定是否勾选
加载,构造树形结构:
private void bindTree() { TreeNode RootNode = new TreeNode("总节点"); this.treeView1.Nodes.Add(RootNode); DataRow[] dr = DataSource.Select("pnt is null"); for (int i = 0; i < dr.Length; i++) { TreeNode tn = new TreeNode(); tn.Text = dr[i]["name"].ToString(); tn.Tag = dr[i]["id"].ToString(); if (dr[i]["isvisible"].ToString().Equals("1")) tn.Checked = true; else tn.Checked = false; FillTree(tn, DataSource); RootNode.Nodes.Add(tn); } } private void FillTree(TreeNode node, DataTable dt) { DataRow[] dr = dt.Select("pnt='" + node.Tag.ToString() + "'"); if (dr.Length > 0) { for (int i = 0; i < dr.Length; i++) { TreeNode n = new TreeNode(); n.Text = dr[i]["name"].ToString(); n.Tag = dr[i]["id"].ToString(); if (dr[i]["isvisible"].ToString().Equals("1")) n.Checked = true; else n.Checked = false; if (dr[i]["pnt"].ToString() == node.Tag.ToString()) { FillTree(n, dt); } node.Nodes.Add(tnn); } } }
勾选某个节点CheckBox后的联动处理
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) { UpdateAllChildNodesCheck(e.Node);//更新下面的所有子节点 UpdateAllparentNodesCheck(e.Node);//更新上面的所有父节点 btnSave.Enabled = true; } void UpdateAllparentNodesCheck(TreeNode treeNode) { TreeNode pnt = treeNode.Parent; if(pnt!=null) { if(pnt.Checked&&!treeNode.Checked)//父节点选中,子节点未选中 { pnt.Checked = false; UpdateAllparentNodesCheck(pnt);//递归更新父节点的父节点 } else if(!pnt.Checked&&treeNode.Checked)//父节点未选中,子节点选中 { bool allCheck = true;//判断该父节点下的所有子节点是否选中 foreach(TreeNode n in pnt.Nodes) { if(false==n.Checked)//只要有一个子节点未选中,则父节点是未选中 { allCheck = false; break; } } if(allCheck) //该父节点所有子节点都选中了 { pnt.Checked = true; UpdateAllparentNodesCheck(pnt); } } } } void UpdateAllChildNodesCheck(TreeNode treeNode) { //递归更新子节点的Checkbox foreach (TreeNode n in treeNode.Nodes) { n.Checked = treeNode.Checked; if (n.Nodes.Count > 0) { UpdateAllChildNodesCheck(n); } } }
最后对比数据源获取更新了的节点,形成sql:
List<string> sAllSql = new List<string>(255); private List<string> GetUpdateSql(TreeNode tNode) { foreach (TreeNode n in tNode.Nodes) { if (n.Tag != null) { DataRow[] adr = DataSource.Select(string.Format("funcid='{0}'", n.Tag.ToString())); if (adr.Length > 0) { string sCheck = n.Checked ? "1" : "0"; if (false == sCheck.Equals(adr[0]["isvisible"].ToString())) { sAllSql.Add(string.Format("UPDATE {0}.TAB SET isvisible='{1}' WHERE id='{2}'", sUser, sCheck, n.Tag.ToString())); if (n.Nodes.Count > 0) { GetUpdateSql(n); } } else if (n.Nodes.Count > 0) GetUpdateSql(n); } } else if (n.Nodes.Count > 0) GetUpdateSql(n); } return sAllSql; }
相关文章推荐
- C#路径/文件/目录/I/O常见操作汇总
- 【原创】C#控件TreeView与数据库的操作
- C#路径/文件/目录/I/O常见操作汇总
- C#路径/文件/目录/I/O常见操作汇总
- C# 路径/文件/目录/I/O常见操作汇总收藏
- C#路径/文件/目录/I/O常见操作汇总
- C#目录操作汇总2
- C#ADO.NET操作数据代码汇总
- C#ADO.NET操作数据代码汇总
- C# 路径/文件/目录/I/O常见操作汇总收藏
- C# GridView 操作汇总
- C# GridView 操作汇总
- C#路径/文件/目录/I/O常见操作汇总
- C#ADO.NET操作数据代码汇总
- C# GridView 操作汇总
- 转:C#控件TreeView与数据库的操作
- C#路径/文件/目录/I/O常见操作汇总
- C# 格式化字符串,日期,字符串操作汇总
- C# 格式化字符串,日期,字符串操作汇总
- C#目录操作汇总