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

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

部分代码:

protected void treeviewbind()
{
string sqlstr=ConfigurationManager.AppSettings["constr"];
SqlConnection con = new SqlConnection(sqlstr);
con.Open();
string strfac = "select * from tDepartment";
SqlDataAdapter ada = new SqlDataAdapter(strfac,con);
DataTable dt = new DataTable();
ada.Fill(dt);
string id = "Department";
string text = "Department";
Bind_Tv(dt, id,text);
dt.Dispose();
ada.Dispose();
con.Close(); }
protected void Bind_Tv(DataTable dt, string id, string text) //TreeView的递归绑定
{
DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据
TreeNode tn;//建立TreeView的节点(TreeNode),以便将取出的数据加入到节点中
foreach (DataRowView row in dv)
{
tn = new TreeNode();//建立一个新节点(学名叫:一个实例)
tn.Value = row[id].ToString();//节点的Value值,一般为数据库的id值
tn.Text = row[text].ToString();//节点的Text,节点的文本显示
TreeView1.Nodes.Add(tn);//将该节点加入到TreeView中
}
}

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

相关代码:

<asp:TreeView ID="TreeView1" runat="server" ImageSet="Simple" CssClass="gridview_m"
OnSelectedNodeChanged="TreeView1_SelectedNodeChanged" NodeIndent="35" ExpandDepth="0"
ShowLines="True" OnTreeNodeExpanded="TreeView1_TreeNodeExpanded">
</asp:TreeView>
protected void bind()   //TreeView的数据绑定
{
string sqlstr = ConfigurationManager.AppSettings["constr"];
SqlConnection conn = new SqlConnection(sqlstr);
conn.Open(); string sqlsel = "select * from tDataSheetDirectory";
SqlCommand cmd = new SqlCommand(sqlsel, conn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt); string id = "DataSheetDirectoryID";
string text = "DirectoryName";
string pid = "FatherID"; DataView dvtop = new DataView(dt); //加入根节点
TreeNode tntop = new TreeNode();
dvtop.RowFilter = "FatherID is null";
foreach (DataRowView row in dvtop)
{
tntop.Value = row[id].ToString();
tntop.Text = row[text].ToString();
TreeView1.Nodes.Add(tntop);
}
sda.Dispose();
cmd.Dispose();
conn.Close();
Bind_Tv(dt, tntop, tntop.Value, id, pid, text);
}
protected void Bind_Tv(DataTable dt, TreeNode p_Node, string pid_val, string id, string pid, string text) //TreeView的递归绑定
{
DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据
//建立TreeView的节点(TreeNode),以便将取出的数据加入到节点中
//下面为三元运算符,假设父id为空,则为构建“父id字段 is null”的查询条件,否则构建“父id字段=父id字段值”的查询条件
string filter = string.IsNullOrEmpty(pid_val) ? pid + " is null" : string.Format(pid + "='{0}'", pid_val);
dv.RowFilter = filter;//利用DataView将数据进行筛选,选出同样 父id值 的数据
foreach (DataRowView row in dv)
{
TreeNode tn = new TreeNode();
tn.Value = row[id].ToString();//节点Value值
tn.Text = row[text].ToString();//节点Text值
p_Node.ChildNodes.Add(tn);//该节点加入到上级节点中
}
} protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
ViewState["DataSheetState"] = 0;
int directoryid = Convert.ToInt32(this.TreeView1.SelectedNode.Value);
string sqlstr = ConfigurationManager.AppSettings["constr"];
SqlConnection con1 = new SqlConnection(sqlstr);
con1.Open();
string strfac1 = "select * from tDataSheetDirectory where DataSheetDirectoryID='" + directoryid + "'";
SqlCommand cmd1 = new SqlCommand(strfac1, con1);
SqlDataReader dr1 = cmd1.ExecuteReader();
dr1.Read();
if (dr1.HasRows)
{
//Label1.Text = dr1["DirectoryName"].ToString();
}
dr1.Dispose();
cmd1.Dispose();
con1.Close();
//ViewState["DataSheetDirectoryID"] = this.TreeView1.SelectedNode.Value;
//GridViewBind("select * from tDataSheet where FatherDirID='" + this.TreeView1.SelectedNode.Value + "'");
GridViewBind("select tDataSheetDirectory.*,tDataSheet.* from tDataSheetDirectory,tDataSheet where tDataSheet.FatherDirID='" + this.TreeView1.SelectedNode.Value + "' and tDataSheet.FatherDirID=tDataSheetDirectory.DataSheetDirectoryID and tDataSheetDirectory.Hidden='显示'");
for (int i = 0; i < this.TreeView1.Nodes.Count; i++)
{//跌迭根节点
if (this.TreeView1.SelectedValue == this.TreeView1.Nodes[i].Value)
{//假设选中的是根节点,就展开
this.TreeView1.SelectedNode.Expanded = true;
}
else
{//假设选中的不是根节点
for (int j = 0; j < this.TreeView1.SelectedNode.Parent.ChildNodes.Count; j++)
{//就让选中节点的全部同级节点收缩
this.TreeView1.SelectedNode.Parent.ChildNodes[j].CollapseAll();
}
//然后再展开选中的节点及其全部父节点
//this.TreeView1.SelectedNode.Parent.Expanded = true;
this.TreeView1.SelectedNode.Expanded = true;
}
}
}protected void TreeView1_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
{
string sqlstr = ConfigurationManager.AppSettings["constr"];
SqlConnection conn = new SqlConnection(sqlstr);
conn.Open(); TreeNode exnode = e.Node; //展开节点
int fid = Convert.ToInt32(exnode.Value); //展开节点ID string sqlsel = "select * from tDataSheetDirectory";
SqlCommand cmd = new SqlCommand(sqlsel, conn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt); NodeExpand(dt, exnode, fid);
} protected void NodeExpand(DataTable dt, TreeNode p_node, int pid)
{
int nextnodec = p_node.ChildNodes.Count; //下级节点个数
for (int i = 0; i < nextnodec; i++)
{
TreeNode tn = p_node.ChildNodes[i];
tn.ChildNodes.Clear();
int nodevalue = Convert.ToInt32(tn.Value);
DataView ndv = new DataView(dt); //获取整个表
ndv.RowFilter = "FatherID = '" + nodevalue + "'"; TreeNode tnn; //下级节点
foreach (DataRowView rown in ndv)
{
tnn = new TreeNode();
tnn.Text = rown["DirectoryName"].ToString();
tnn.Value = rown["DataSheetDirectoryID"].ToString();
tn.ChildNodes.Add(tnn);
}
}
}

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. NIVC-&gt;IPR[IPADDR]

    #include <stm32f10x.h>   #include "sys.h" //表偏移地址 //NVIC_VectTab:基址 //Offset:偏移量 //C ...

  2. 使用shell命令分析统计日志

    用户需要登录统计信息,当分析用户行为,使用shell通常可以很容易地取出了大量的数据.删除,然后放入excel统计. 例如:统计日志含有loadCustomProcess这个地址的訪问,按訪问耗时排序 ...

  3. Cache基础知识OR1200在ICache一个简短的引论

    以下摘录<步骤吓得核心--软-core处理器的室内设计与分析>一本书 12.1 Cache基本知识 12.1.1 Cache的作用 处理器的设计者通常会声称其设计的处理器一秒钟能做多少次乘 ...

  4. ASP.NET MVC (Razor)开发

    ASP.NET MVC (Razor)开发 过去我们使用过一些周报工具来完成项目组或部门的周报填写与考核工作,但多少有些不理想,要么功能太过简单,要么功能特别繁杂,不接地气,使用不便. 后来我们就考虑 ...

  5. VB.NET之错误异常处理

    相对于VB而言,VB.NET中引入了很多特色.当中最吸引我的就是引入了结构化异常处理. 尽管VB.NET仍然支持OnError Goto类型的异常处理,可是这样做并非非常好.相比而言,结构化异常处理更 ...

  6. Spring先进的交易管理困难剖析

    1Spring事务传播行为 所谓事务传播行为就是多个事务方法相互调用时,事务怎样在这些方法间传播.Spring支持7种事务传播行为 PROPAGATION_REQUIRED(增加已有事务) 假设当前没 ...

  7. [Django1.6]The MEDIA_ROOT and STATIC_ROOT settings must different 解决

    该项目有一个图片上传功能,为了把上传路径很简单,写在同一个静态文件路径,于wi7执行机器上没问题,今centos我们报道了机上,如下面的错误: django.core.exceptions.Impro ...

  8. CodeForces 398B 概率DP 记忆化搜索

    题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...

  9. JTextField限制输入长度的完美解决方案(转)

    关于JTextField限制输入字符长度的问题,因为没提供现成的api,所以我们得自己动手,来实现这个功能,网上也有很多这样的资料,大多是在JTextField的Document的insertStri ...

  10. UVa 11790 - Murcia&#39;s Skyline

    称号:给你一个行长度的建设和高度,我们祈求最长的和下降的高度. 分析:dp,最大上升子. 说明:具有长度,不能直接优化队列单调. #include <iostream> #include ...