欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C# TreeView控件 展示数据的两种方式

程序员文章站 2022-06-08 14:02:21
...

本文档所用表结构  ItemId,ItemName,ParentId,Level,

1、普通数据绑定。将所有数据读取到临时表,再通过对表数据的筛选进而为树控件添加数据。

     //初始化树
        private void InitTreeView(string id, string name)
        {
            // 读取数据库数据到DataSet
            string sql = "select ItemId,ItemName,ParentId from tb_Item  ";
            SqlParameter[] paras = new SqlParameter[] {
                    new SqlParameter("@FItemClassID",id),};
            DbHelperSQL.FillDataSet(ds, sql);

            //绑定树节点
            treeView1.Nodes.Clear();
            TreeNode rootNode = new TreeNode();
            rootNode.Tag = "0";
            rootNode.Text = name;
            treeView1.Nodes.Add(rootNode);
            getNodes1(rootNode);
            rootNode.Expand();
            
        }
        //初始化树的其他节点 
        private void getNodes(TreeNode node)
        {
            DataRow[] rows = ds.Tables[0].Select("ParentId=" + node.Tag.ToString());
            foreach (DataRow classdr in rows)
            {
                TreeNode ClassNode = new TreeNode();
                ClassNode.Tag = classdr["ItemId"].ToString();
                ClassNode.Text = classdr["ItemName"].ToString();
                getNodes(ClassNode);
                node.Nodes.Add(ClassNode);
            }
            ds.Dispose();
        }


2、数据量太大的话,加载会有延时,这时候可以通过点击展开节点的时候进行加载数据,这样,会根据树的深度一层一层的加载数据,数据量是很小的,几乎没有延时

DataSet dsTree = new DataSet();
        public void BindRootNode(string Id,string name)
        {
            string sqlTree = "select ItemId,ItemName,ParentId,Level from tb_item ";
            DbHelperSQL.FillDataSet(dsTree, sqlTree);
            treeView1.Nodes.Clear();           
            TreeNode rootNode = new TreeNode();
            rootNode.Tag = id;
            rootNode.Text = name;
            treeView1.Nodes.Add(rootNode);
            GetLevelNodes(rootNode, dsTree.Tables[0], rootNode.Level + 1);
            rootNode.Expand(); 	   
           dsTree.Dispose();
        }    
//按级别初始化树的其他节点
public void GetLevelNodes(TreeNode node,DataTable dt,int level)
        {
            DataRow[] rows = dt.Select("Level="+level+" and ParentId='"+node.Tag+"'");
            if (rows.Length > 0)
            {
                //node.Nodes.Remove(node.NextNode);
                foreach (DataRow classdr in rows)
                {
                    TreeNode ClassNode = new TreeNode();
                    ClassNode.Tag = classdr["ItemId"].ToString();
                    ClassNode.Text = classdr["ItemName"].ToString();
                    node.Nodes.Add(ClassNode);
                    //为每个节点添加一个下级节点保证该节点前面有+
                    TreeNode NullNode = new TreeNode();
                    NullNode.Tag = "1";
                    NullNode.Text = "1";
                    ClassNode.Nodes.Add(NullNode);
                }
            }
            else//添加判断是否绑定叶子节点
            {
                BindLeaf(node,dt);
            }
            
            dsTree.Dispose();
        }


//这是个事件--展开节点事件
 private void treeView1_AfterExpand(object sender, TreeViewEventArgs e)
        {
            treeView1.SelectedNode = e.Node;
          
            if (treeView1.SelectedNode.Level != 0)
            {
                TreeNode tSelNode = treeView1.SelectedNode;
                tSelNode.Nodes.Clear();
                GetLevelNodes(treeView1.SelectedNode, dsTree.Tables[0], treeView1.SelectedNode.Level + 1);
            
            }
        }