TreeView的绑定

最近遇到了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的绑定,布布扣,bubuko.com

时间: 2024-07-29 23:44:00

TreeView的绑定的相关文章

WPF TreeView IsExpanded 绑定不上的问题

最近项目上需要通过MVVM来控制TreeView,其中需要需要控制通过搜索来定位某个节点,正常逻辑下,首先通过需要在树上面找到该节点,然后选中该节点,并将该节点的父节点展开,这个时候需要通过MVVM来控制,需要绑定起来,只是一直没有binding上,代码如下: MVVM示例代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Collections.ObjectModel; 4 using System.Li

TreeView递归绑定无限分类数据

实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name Nvarchar(64) 实现数据绑定: private void ControlsDataBind() { tvCategory.Nodes.Clear(); List<Models.Category> types = CommonNews.Helper.OperateContext.Current.LoadNewsTypes();

treeview递归绑定的两种方法

方法一: 复制代码代码如下: public void creattree(int fid, TreeNode parentnode)           { DataTable dt = new DataTable();               dt = op.BindGroup();               DataRow[] drs = dt.Select("parentid=" + fid);               foreach (DataRow row in d

WPF - TreeView 仿VS2013解决方案资源管理器中的树状结构

效果图 先上效果图,若是你想要的效果,可以继续看下面的代码,不想浪费大家的时间. 样式定义 此处定义TreeView的样式,参考自MSDN,稍作修改. 注意:在TreeViewItem控件模板定义中绑定一个数据(Level)以及一个值转换器(LevelToMarginConverter),具体定义见下部分. <Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton"> <Se

Silverlight&#160;中&#160;TreeView&#160;的数据绑定

Silverlight使用XAML标记语言来编写,如果不使用XAML强大的绑定功能,实在是罪过.通过使用绑定,可以将UI与视图模型层分离,有利于系统的维护.作为Silverlight中比较有代表型的一个控件: TreeView 有着比较特殊的绑定.与一般的绑定不同,绑定到TreeView的元素之间是一个无限级联的关系.下面是这种绑定的最简单实现过程. 1, 引用命名空间:clr­namespace:System.Windows?assembly=System.Windows.Controls:给

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

昨天接近下班,一个群里面的网友,问treeView绑定后  选中命令怎么来处理,怎么没有效果,而且用MVVM的方式来写:快下班了本来想远程帮他看下,结果就说写个Demo给他看:再加上选中传参: 下面分享下代码: 1 <TreeView Height="264" x:Name="tvProperties" Width="220" ItemsSource="{Binding MyProperty}"><!--数据

C# Application Excel TreeView

三章 应用 20节客户表登陆 //动软--单表--Models --新建.net项目--简单三层管理--DBUtity--DbHelper.cs 21节客户表数据读取 增加 CEnterprise(企事业单位;事业),CBirthday 22-24节客户表添加.修改.删除 ;select @@IDENTITY //返回刚插入的id 25节补充MD5 using System.Security.Cryptography; byte[] inBytes=Encoding.Default.GetByt

C#畅谈“网络电视”

C#畅谈“网络电视” 以上是大家比较喜欢的网络电视软件,例如:PPTV,BOX央视影音,PPS等. 今天我就和大家来聊一下简单的“网络电视”.虽然和上边的软件没发比,但是正在向着这个目标努力中…… 一开始我在做这个项目的时候思路很茫然,就像地上的一团线团一样. 我需要用到哪些方法?需要建几个类? 拿到一个项目的时候首先要分析我想大家都知道 主界面如下: 既然是网络电视,那么肯定有很多的频道供用户去选择.所以肯定有频道类,要定义一个频道的基类(ChannelBase),让所有频道类继承这个基类,提

winform treeview绑定数据 DOM操作

form1 public void treeView() { // datatable 定义变量接收 传归来的值 DataTable Father = new BuMenDA().ConSql(); //查询出来的的结果不可能为空 for循环一条条查出来 for (int a = 0; a <= Father.Rows.Count; a++) {// 定义新的节点接a行的 Name列 TreeNode fatherNode = new TreeNode(Father.Rows[a]["Na