近期遇到了TreeView的数据库绑定问题,确实是弄了我好几天,特别是多级节点的分步绑定,最開始不分步,发现所有载入页面都卡爆了,真心让人头疼。所以放出来,给须要的朋友看看,以免大家走冤枉路。

1.仅仅有一级节点的数据表绑定

部分代码:

  1. protected void treeviewbind()
  2. {
  3. string sqlstr=ConfigurationManager.AppSettings["constr"];
  4. SqlConnection con = new SqlConnection(sqlstr);
  5. con.Open();
  6. string strfac = "select * from tDepartment";
  7. SqlDataAdapter ada = new SqlDataAdapter(strfac,con);
  8. DataTable dt = new DataTable();
  9. ada.Fill(dt);
  10. string id = "Department";
  11. string text = "Department";
  12. Bind_Tv(dt, id,text);
  13. dt.Dispose();
  14. ada.Dispose();
  15. con.Close();
  16.  
  17. }
  18. protected void Bind_Tv(DataTable dt, string id, string text) //TreeView的递归绑定
  19. {
  20. DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据
  21. TreeNode tn;//建立TreeView的节点(TreeNode),以便将取出的数据加入到节点中
  22. foreach (DataRowView row in dv)
  23. {
  24. tn = new TreeNode();//建立一个新节点(学名叫:一个实例)
  25. tn.Value = row[id].ToString();//节点的Value值,一般为数据库的id值
  26. tn.Text = row[text].ToString();//节点的Text,节点的文本显示
  27. TreeView1.Nodes.Add(tn);//将该节点加入到TreeView中
  28. }
  29. }

2.多级节点分步载入绑定

相关代码:

  1. <asp:TreeView ID="TreeView1" runat="server" ImageSet="Simple" CssClass="gridview_m"
  2. OnSelectedNodeChanged="TreeView1_SelectedNodeChanged" NodeIndent="35" ExpandDepth="0"
  3. ShowLines="True" OnTreeNodeExpanded="TreeView1_TreeNodeExpanded">
  4. </asp:TreeView>
  1. protected void bind() //TreeView的数据绑定
  2. {
  3. string sqlstr = ConfigurationManager.AppSettings["constr"];
  4. SqlConnection conn = new SqlConnection(sqlstr);
  5. conn.Open();
  6.  
  7. string sqlsel = "select * from tDataSheetDirectory";
  8. SqlCommand cmd = new SqlCommand(sqlsel, conn);
  9. SqlDataAdapter sda = new SqlDataAdapter(cmd);
  10. DataTable dt = new DataTable();
  11. sda.Fill(dt);
  12.  
  13. string id = "DataSheetDirectoryID";
  14. string text = "DirectoryName";
  15. string pid = "FatherID";
  16.  
  17. DataView dvtop = new DataView(dt); //加入根节点
  18. TreeNode tntop = new TreeNode();
  19. dvtop.RowFilter = "FatherID is null";
  20. foreach (DataRowView row in dvtop)
  21. {
  22. tntop.Value = row[id].ToString();
  23. tntop.Text = row[text].ToString();
  24. TreeView1.Nodes.Add(tntop);
  25. }
  26. sda.Dispose();
  27. cmd.Dispose();
  28. conn.Close();
  29. Bind_Tv(dt, tntop, tntop.Value, id, pid, text);
  30. }
  31. protected void Bind_Tv(DataTable dt, TreeNode p_Node, string pid_val, string id, string pid, string text) //TreeView的递归绑定
  32. {
  33. DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据
  34. //建立TreeView的节点(TreeNode),以便将取出的数据加入到节点中
  35. //下面为三元运算符,假设父id为空,则为构建“父id字段 is null”的查询条件,否则构建“父id字段=父id字段值”的查询条件
  36. string filter = string.IsNullOrEmpty(pid_val) ? pid + " is null" : string.Format(pid + "='{0}'", pid_val);
  37. dv.RowFilter = filter;//利用DataView将数据进行筛选,选出同样 父id值 的数据
  38. foreach (DataRowView row in dv)
  39. {
  40. TreeNode tn = new TreeNode();
  41. tn.Value = row[id].ToString();//节点Value值
  42. tn.Text = row[text].ToString();//节点Text值
  43. p_Node.ChildNodes.Add(tn);//该节点加入到上级节点中
  44. }
  45. }
  46.  
  47. protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
  48. {
  49. ViewState["DataSheetState"] = 0;
  50. int directoryid = Convert.ToInt32(this.TreeView1.SelectedNode.Value);
  51. string sqlstr = ConfigurationManager.AppSettings["constr"];
  52. SqlConnection con1 = new SqlConnection(sqlstr);
  53. con1.Open();
  54. string strfac1 = "select * from tDataSheetDirectory where DataSheetDirectoryID='" + directoryid + "'";
  55. SqlCommand cmd1 = new SqlCommand(strfac1, con1);
  56. SqlDataReader dr1 = cmd1.ExecuteReader();
  57. dr1.Read();
  58. if (dr1.HasRows)
  59. {
  60. //Label1.Text = dr1["DirectoryName"].ToString();
  61. }
  62. dr1.Dispose();
  63. cmd1.Dispose();
  64. con1.Close();
  65. //ViewState["DataSheetDirectoryID"] = this.TreeView1.SelectedNode.Value;
  66. //GridViewBind("select * from tDataSheet where FatherDirID='" + this.TreeView1.SelectedNode.Value + "'");
  67. GridViewBind("select tDataSheetDirectory.*,tDataSheet.* from tDataSheetDirectory,tDataSheet where tDataSheet.FatherDirID='" + this.TreeView1.SelectedNode.Value + "' and tDataSheet.FatherDirID=tDataSheetDirectory.DataSheetDirectoryID and tDataSheetDirectory.Hidden='显示'");
  68. for (int i = 0; i < this.TreeView1.Nodes.Count; i++)
  69. {//跌迭根节点
  70. if (this.TreeView1.SelectedValue == this.TreeView1.Nodes[i].Value)
  71. {//假设选中的是根节点,就展开
  72. this.TreeView1.SelectedNode.Expanded = true;
  73. }
  74. else
  75. {//假设选中的不是根节点
  76. for (int j = 0; j < this.TreeView1.SelectedNode.Parent.ChildNodes.Count; j++)
  77. {//就让选中节点的全部同级节点收缩
  78. this.TreeView1.SelectedNode.Parent.ChildNodes[j].CollapseAll();
  79. }
  80. //然后再展开选中的节点及其全部父节点
  81. //this.TreeView1.SelectedNode.Parent.Expanded = true;
  82. this.TreeView1.SelectedNode.Expanded = true;
  83. }
  84. }
  85. }protected void TreeView1_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
  86. {
  87. string sqlstr = ConfigurationManager.AppSettings["constr"];
  88. SqlConnection conn = new SqlConnection(sqlstr);
  89. conn.Open();
  90.  
  91. TreeNode exnode = e.Node; //展开节点
  92. int fid = Convert.ToInt32(exnode.Value); //展开节点ID
  93.  
  94. string sqlsel = "select * from tDataSheetDirectory";
  95. SqlCommand cmd = new SqlCommand(sqlsel, conn);
  96. SqlDataAdapter sda = new SqlDataAdapter(cmd);
  97. DataTable dt = new DataTable();
  98. sda.Fill(dt);
  99.  
  100. NodeExpand(dt, exnode, fid);
  101. }
  102.  
  103. protected void NodeExpand(DataTable dt, TreeNode p_node, int pid)
  104. {
  105. int nextnodec = p_node.ChildNodes.Count; //下级节点个数
  106. for (int i = 0; i < nextnodec; i++)
  107. {
  108. TreeNode tn = p_node.ChildNodes[i];
  109. tn.ChildNodes.Clear();
  110. int nodevalue = Convert.ToInt32(tn.Value);
  111. DataView ndv = new DataView(dt); //获取整个表
  112. ndv.RowFilter = "FatherID = '" + nodevalue + "'";
  113.  
  114. TreeNode tnn; //下级节点
  115. foreach (DataRowView rown in ndv)
  116. {
  117. tnn = new TreeNode();
  118. tnn.Text = rown["DirectoryName"].ToString();
  119. tnn.Value = rown["DataSheetDirectoryID"].ToString();
  120. tn.ChildNodes.Add(tnn);
  121. }
  122. }
  123. }

TreeView的绑定的更多相关文章

  1. TreeView递归绑定无限分类数据

    TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...

  2. TreeView递归绑定数据的两种方法

    #region 绑定TreeView /// <summary> /// 绑定TreeView(利用TreeNode) /// </summary> /// <param ...

  3. WPF TreeView IsExpanded 绑定不上的问题

    最近项目上需要通过MVVM来控制TreeView,其中需要需要控制通过搜索来定位某个节点,正常逻辑下,首先通过需要在树上面找到该节点,然后选中该节点,并将该节点的父节点展开,这个时候需要通过MVVM来 ...

  4. TreeView的绑定与读取

    /// <summary>        /// 绑定TreeView        /// </summary>        public void BindTreeVie ...

  5. 母版页 treeview控件 SiteMapPath控件 treeview数据库绑定模式

     母版页就是网站中一样的部分母版页的后缀名是.Master可以把母版页当成一个页面  想让哪里是别的内容就可以  通过如下: <asp:ContentPlaceHolder ID="C ...

  6. C/C++ Qt 数据库与TreeView组件绑定

    在上一篇博文<C/C++ Qt 数据库QSql增删改查组件应用>介绍了Qt中如何使用SQL操作函数,并实现了对数据库的增删改查等基本功能,从本篇开始将实现数据库与View组件的绑定,通过数 ...

  7. python tkinter Treeview 事件绑定

    def trefun(event): sels= event.widget.selection()#event.widget获取Treeview对象,调用selection获取选择对象名称 for i ...

  8. Silverlight 中 TreeView 的数据绑定

    方法一:Silverlight使用XAML标记语言来编写,如果不使用XAML强大的绑定功能,实在是罪过.通过使用绑定,可以将UI与视图模型层分离,有利于系统的维护.作为Silverlight中比较有代 ...

  9. TreeView 数据绑定及选中命令处理

    昨天接近下班,一个群里面的网友,问treeView绑定后  选中命令怎么来处理,怎么没有效果,而且用MVVM的方式来写:快下班了本来想远程帮他看下,结果就说写个Demo给他看:再加上选中传参: 下面分 ...

随机推荐

  1. Robot Framework 使用1-环境配置及简单网站兼容性测试(转)

    0.Robot Framework 简介 Robot Framework 是一个通用的自动化测试框架,主要用于“验收测试”和“验收测试驱动开发(ATDD)” (会其它文章中会详细介绍ATDD).它使用 ...

  2. 源码编译安装 MySQL 5.5.x 实践(转)

    1.安装cmakeMySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. # wget ht ...

  3. java.lang.ClassCastException: java.lang.NoClassDefFoundError cannot be cast to java.lang.RuntimeException

    不是一个Exception,而是一个Error,要强制转成Exception类型,就出错了java.lang.NoClassDefFoundError java.lang.RuntimeExcepti ...

  4. php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)使用方法差别

    在mysql中 FOUND_ROWS()与COUNT(*)都能够统计记录.假设都一样为什么会有两个这种函数呢.以下我来介绍SELECT FOUND_ROWS()与COUNT(*)使用方法差别 SELE ...

  5. Oracle 多行转多列

    Oracle 多行转多列,列值转为列名   前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要到处问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的 ...

  6. 深入理解Android View(转)

    做android其实也有一段时间了,我们每个人都会碰到一些这样或那样的问题,碰到问题了就拼命百度,可是发现,我们解决问题的能力并没有提升很多,所以我才有想总结一下我项目中所用过的相关知识,并了解一下A ...

  7. UOJ #5. 【NOI2014】动物园 扩大KMP

    第一次NOI称号. ... 扩展假设知道KMP如果. .. . 就是水题了. ... #5. [NOI2014]动物园 统计提交情况 描写叙述 提交 近日.园长发现动物园中好吃懒做的动物越来越多了.比 ...

  8. 快速解读GC日志(转)

    本文是 Plumbr 发行的 Java垃圾收集手册 的部分内容.文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息.我们通过 -XX:+UseSerialGC 选项,指定JVM ...

  9. 原因好消息: PSP游戏自己主动算法设计(两)

    这是我们讲的传说中的一项措施A×算法.事实上,类上传之前似小件,下面我们分析一下它去 毕竟,在游戏程序,我们从移动一个点到另一个点.和得到的轨迹的最短距离,类别似这样的算法以及几个.运营效率几乎是相同 ...

  10. rabbitMQ说明文档

    rabbitMQ是什么 RabbitMQ     是由     LShift     提供的一个     Advanced Message Queuing Protocol (AMQP)     的开 ...