网上关于Treeview的代码虽然多 但是都是很乱 实用性和正确性也不是很好 只好自己写一套了,时间比较紧张 性能可能还需调整

以用户组织的一个实际例子来讲诉Treeview的用法吧

组织表结构:

用户组织表结构:

前台界面aspx

  1. <form id="Form1" runat="server">
  2. <table>
  3.  
  4. <tr>
  5. <td class="contentTD">
  6. <div id="MyTreeDiv">
  7. <asp:TreeView ShowCheckBoxes="All" ID="MyTreeView" ImageSet="Contacts" runat="server" ExpandDepth="" Width="400px" BorderStyle="Solid" BorderWidth="1px">
  8. </asp:TreeView>
  9. </div>
  10. </td>
  11. </tr>
  12. <tr>
  13.  
  14. <td class="content">
  15. <asp:Button ID="btnSubmit" runat="server" Text="提 交" CssClass="dotNetButton" OnClick="btnSubmit_Click" /><input type="button" class="glbutton" onclick="history.go(-1);"
  16. value="返 回" />
  17. <asp:ListBox ID="ListBox1" Visible="false" runat="server"></asp:ListBox>
  18. </td>
  19. </tr>
  20. </table>
  21. </form>

js控制父节点选中子节点自动选中

  1. <script>
  2. function Davidovitz_HandleCheckbox() {
  3. var element = event.srcElement;
  4. if (element.tagName == "INPUT" && element.type == "checkbox") {
  5. var checkedState = element.checked;
  6. while (element.tagName != "TABLE") // Get wrapping table
  7. {
  8. element = element.parentElement;
  9. }
  10.  
  11. Davidovitz_UnCheckParents(element); // Uncheck all parents
  12.  
  13. element = element.nextSibling;
  14.  
  15. if (element == null) // If no childrens than exit
  16. return;
  17.  
  18. var childTables = element.getElementsByTagName("TABLE");
  19. for (var tableIndex = ; tableIndex < childTables.length; tableIndex++) {
  20. Davidovitz_CheckTable(childTables[tableIndex], checkedState);
  21. }
  22. }
  23. }
  24.  
  25. // Uncheck the parents of the given table, Can remove the recurse (redundant)
  26. function Davidovitz_UnCheckParents(table) {
  27. if (table == null || table.rows[].cells.length == ) // This is the root
  28. {
  29. return;
  30. }
  31. var parentTable = table.parentElement.previousSibling;
  32. Davidovitz_CheckTable(parentTable, false);
  33. Davidovitz_UnCheckParents(parentTable);
  34. }
  35.  
  36. // Handle the set of checkbox checked state
  37. function Davidovitz_CheckTable(table, checked) {
  38. var checkboxIndex = table.rows[].cells.length - ;
  39. var cell = table.rows[].cells[checkboxIndex];
  40. var checkboxes = cell.getElementsByTagName("INPUT");
  41. if (checkboxes.length == ) {
  42. checkboxes[].checked = checked;
  43. }
  44. }
  45.  
  46. </script>

后台代码.cs

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. if (!IsPostBack)
  4. {
  5. this.MyTreeView.Attributes.Add("onclick", "Davidovitz_HandleCheckbox()");
  6.  
  7. bind();
  8. }
  9. }
  10. //数据绑定
  11. private void bind()
  12. {
  13. this.MyTreeView.Nodes.Clear();
  14. //读取组织列表
  15. DataTable dt = new T_GroupManager().GetDataTableBySQL(" and FState=1 and FCreatorID = " + Request.QueryString["id"]);
  16.  
  17. this.ViewState["ds"] = dt;
  18. //调用递归函数,完成树形结构的生成
  19. AddTree(, (TreeNode)null);
  20.  
  21. if (Request.QueryString["id"] != null)
  22. {
  23. //根据用户ID查找对应的用户组织结构,勾上
  24. List<T_UserGroup> list = new T_UserGroupManager().GetAllBySQL(" and FUSerID=" + Request.QueryString["id"]).ToList();
  25. ViewState["UserGroup"] = list;
  26. foreach (T_UserGroup item in list)
  27. {
  28. for (int i = ; i < this.MyTreeView.Nodes.Count; i++)
  29. {
  30. if (MyTreeView.Nodes[i].ChildNodes.Count > ) //判断是否还有子节点
  31. {
  32. SetNode(MyTreeView.Nodes[i]);
  33. }
  34. if (MyTreeView.Nodes[i].Value == item.FGroupID.ToString()) //判断是否被选中
  35. {
  36. MyTreeView.Nodes[i].Checked = true;
  37. }
  38. }
  39. }
  40. }
  41. }
  42. //查找子节点
  43. public void SetNode(TreeNode node)
  44. {
  45. if (Request.QueryString["id"] != null)
  46. {
  47. //根据ID查找对应的组织结构,勾上
  48. List<T_UserGroup> list = ViewState["UserGroup"] as List<T_UserGroup>;
  49. foreach (T_UserGroup item in list)
  50. {
  51. for (int i = ; i < node.ChildNodes.Count; i++)
  52. {
  53. if (node.ChildNodes[i].ChildNodes.Count > ) //判断是否还有子节点
  54. {
  55. SetNode(node.ChildNodes[i]); //递归查找
  56. }
  57. if (node.ChildNodes[i].Value == item.FGroupID.ToString()) //判断是否被选中
  58. {
  59. node.ChildNodes[i].Checked = true;
  60. }
  61. }
  62. }
  63. }
  64. }
  65.  
  66. //递归添加树的节点
  67. public void AddTree(int ParentID, TreeNode pNode)
  68. {
  69. DataTable ds = (DataTable)this.ViewState["ds"];
  70. DataView dvTree = new DataView(ds);
  71. //过滤ParentID,得到当前的所有子节点
  72. dvTree.RowFilter = "[FParentUserID] = " + ParentID;
  73.  
  74. foreach (DataRowView Row in dvTree)
  75. {
  76. TreeNode Node = new TreeNode();
  77. if (pNode == null)
  78. {
  79. //添加根节点
  80. Node.Text = Row["FGroupName"].ToString();
  81. Node.Value = Row["PID"].ToString();
  82. this.MyTreeView.Nodes.Add(Node);
  83. Node.Expanded = true;
  84. //再次递归
  85. AddTree(Int32.Parse(Row["PID"].ToString()), Node);
  86. }
  87. else
  88. {
  89. //添加当前节点的子节点
  90. Node.Text = Row["FGroupName"].ToString();
  91. Node.Value = Row["PID"].ToString();
  92. pNode.ChildNodes.Add(Node);
  93. Node.Expanded = true;
  94. //再次递归
  95. AddTree(Int32.Parse(Row["PID"].ToString()), Node);
  96. }
  97. }
  98. }
  99. /// <summary>
  100. /// 保存
  101. /// </summary>
  102. /// <param name="sender"></param>
  103. /// <param name="e"></param>
  104. protected void btnSubmit_Click(object sender, EventArgs e)
  105. {
  106. for (int i = ; i < MyTreeView.Nodes.Count; i++)
  107. {
  108. if (MyTreeView.Nodes[i].ChildNodes.Count > ) //判断是否还有子节点
  109. {
  110. GetNode(MyTreeView.Nodes[i]);
  111. }
  112. if (MyTreeView.Nodes[i].Checked == true) //判断是否被选中
  113. {
  114. string s = MyTreeView.Nodes[i].Value.ToString();
  115. ListBox1.Items.Add(s);
  116. }
  117. }
  118. T_UserGroupManager gm = new T_UserGroupManager();
  119. //清空
  120. List<T_UserGroup> list = ViewState["UserGroup"] as List<T_UserGroup>;
  121. foreach (T_UserGroup item in list)
  122. {
  123. gm.DeleteByPID(item.PID);
  124. }
  125. int id = Convert.ToInt32(Request.QueryString["id"]);
  126. //保存
  127. foreach (var item in ListBox1.Items)
  128. {
  129. T_UserGroup ug = new T_UserGroup();
  130. ug.FUSerID = id;
  131. ug.FGroupID = Convert.ToInt32((item as ListItem).Value);
  132. ug.FState = ;
  133. gm.Add(ug);
  134. }
  135. ShowJS("<script>alert('保存成功!');location = 'UserGroupInfo.aspx'</script>");
  136. }
  137. //获取选中节点
  138. public void GetNode(TreeNode node)
  139. {
  140. for (int i = ; i < node.ChildNodes.Count; i++)
  141. {
  142. if (node.ChildNodes[i].ChildNodes.Count > ) //判断是否还有子节点
  143. {
  144. GetNode(node.ChildNodes[i]); //递归查找
  145. }
  146. if (node.ChildNodes[i].Checked == true) //判断是否被选中
  147. {
  148. string s = node.ChildNodes[i].Value.ToString();
  149. ListBox1.Items.Add(s);
  150. }
  151. }
  152. }
  153. }

基本上面就是全部代码了,实现了Treeview的读取和根据勾选保存,根据用户配置设置Treeview的勾选项

用了好一段时间才整理出来的,要转载的童鞋记得保留我的链接哦http://www.cnblogs.com/linyijia/p/3497503.html

asp.net treeview 总结的更多相关文章

  1. asp .Net TreeView实现数据绑定和事件响应

    最近做了一个图书馆管理系统,其中要实现中图法分类号查询,因为初学asp ,感觉还有点难度, 第一步:数据库文件 第二步 向界面中拖进TreeView控件 第三步添加事件 下面是cs文件代码 //Tre ...

  2. asp 使用TreeView控件

    这段代码为了使用 TreeNodeCheckChanged 事件,会有回刷新的效果: 不喜欢的可查看改进版,利用js控制选择操作,无界面刷新, “http://www.cnblogs.com/GoCi ...

  3. asp.net treeview 异步加载

    在使用TreeView控件的时候,如果数据量太大,这个TreeView控件加载会很慢,有时甚至加载失败, 为了更好的使用TreeView控件加载大量的数据,采用异步延迟加载TreeView. 在Tre ...

  4. ASP.NET - TreeView 增删

    效果: 前端代码: <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Si ...

  5. ASP.NET - TreeView

    设置节点图片 : Windows资源管理器左侧的树型资源结构图中,各节点都有图片连接,例如磁盘的图片.光盘的图片和文件夹的图片等,使资源的表现更加形象.IEWebControls的TreeView控件 ...

  6. 转:asp.net TreeView CheckChanged 事件浅谈

    http://blog.csdn.net/xiage/article/details/5128755 在开发中经常可以碰到类似的问题: 想通过一个树父节点的TreeNodeCheckChanged 事 ...

  7. asp.net TreeView控件绑定数据库显示信息

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  8. asp.net TreeView与XML配合使用v1.1

    刚我在做Tree view 绑定时自己摸索了一下,网上有人说TreeView绑定数据源,用什么递归绑定啥的,我不想看了,就自己试着写了一个 我是这样做的,如果有什么问题请大神指导,我是菜鸟额.. 1: ...

  9. ASP.NET - TreeView控件,只操作最后一级节点

    效果: 使用母板页进行,左右页面进行跳转. 绑定TreeView控件:http://www.cnblogs.com/KTblog/p/4792302.html 主要功能: 点击节点的时候,只操作最后一 ...

随机推荐

  1. 【pyhon】nvshens图片批量下载爬虫

    代码: # nvshens图片批量下载爬虫 from bs4 import BeautifulSoup import requests import time import urllib.reques ...

  2. Mycat(4):消息表mysql数据库分表实践

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46882777 未经博主同意不得转载. 1,业务需求 比方一个社交软件,比方像腾讯 ...

  3. PHP超过三十秒怎么办Maximum execution time of 30 seconds exceeded

    1 如图所示, Maximum execution time of 30 seconds exceeded 2 在php.ini文件中查找"max_execution_time"把 ...

  4. Android之GPS定位详解

    一.LocationManager LocationMangager,位置管理器.要想操作定位相关设备,必须先定义个LocationManager.我们可以通过如下代码创建LocationManger ...

  5. 重置 radio 和 checkbox 的样式

    代码: <!doctype html> <html> <head> <meta charset="utf-8"> <title ...

  6. Patterns-Proxy

    http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924 1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问 ...

  7. ibatis 批量插入

      ibatis 批量插入 CreationTime--2018年7月2日10点21分 Author:Marydon 1.说明 基于oracle的sql语句 2.主键id有默认值,比如:sys_gui ...

  8. mysql last_insert_id() (转载)

    先来看看官方的说明 The ID that was generated is maintained in the server on a per-connection basis. This mean ...

  9. Tomcat中配置MySQL数据库连接池

    Web开发中与数据库的连接是必不可少的,而数据库连接池技术很好的优化了动态页与数据库的连接,相比单个连接数据库连接池节省了很大的资源.用一个通俗的比喻:如果一个人洗澡需花一桶水,那一百个人就要花一百桶 ...

  10. Overlapped I/O模型深入分析(转)

    随笔 - 262  文章 - 0  评论 - 531  博客园  首页  新随笔  联系  管理  订阅  Overlapped I/O模型深入分析(转) 简述:    Overlapped I/O也 ...