Winform中的Treeview动态绑定数据库

时间:2022-09-12 13:25:22
http://hi.csdn.net/attachment/201108/18/2151848_1313640213fX13.png
定义的表如上:
Levels表示的是节点层数,-1为根节点,1为第一层的节点。。。。
levelstr表示节点描述,00是根节点,0101位第一层第一个节点,0102是第一层第二个节点。。。
怎么把表中的数据动态绑定到treeview的节点中??求代码

18 个解决方案

#2


怎么只有一个链接没有直接显示图片啊!

#3


引用 2 楼 z4213489 的回复:
怎么只有一个链接没有直接显示图片啊!

那是贴的连接
Winform中的Treeview动态绑定数据库

#4


引用 1 楼 taomanman 的回复:
http://topic.csdn.net/u/20110621/17/7bad3c94-2761-4d39-84fa-db95b8e66977.html

你的方法只能一层写代码,我的数据表是无限分层的。。
按你的思路我看看能不能写个递归方法实现绑定。。
如果可以你能帮写个?

#5


写不出来啊。。。哪个高手帮忙写个递归算法
或者能实现我要求的代码也行啊

#6


求高手解决啊!

#7


递归 像这样http://www.360doc.com/content/10/0830/16/2801906_49918583.shtml

#8


levelid 应该改成parentid 这样就可以用递归来做了!

#9


“定义的表如上:
Levels表示的是节点层数,-1为根节点,1为第一层的节点。。。。
levelstr表示节点描述,00是根节点,0101位第一层第一个节点,0102是第一层第二个节点。。。”

你都把思路描述出来了,那里从DataTable取出数据后,一个一个动态创建数据不就可以实现了吗?

#10


引用 8 楼 rqx110 的回复:
levelid 应该改成parentid 这样就可以用递归来做了!

这个表不能变,我也蛋疼呢,其他模块涉及到这个表
现在不能解决的问题是怎么获取某个节点所有子节点的数据项!

#11


自己刚刚写完,,绑了四级,,部分代码写的不够规范可以优化下。。。

 private void bindTreeView4()
        {
            string sql = "select * from test";
            DataTable dt = db.ExecuteDataTable(sql, CommandType.Text, null);
            DataRow[] dr = dt.Select("levers='1'");
            
            for (int i = 0; i < dr.Length; i++)
            {   
                TreeNode tn = new TreeNode("总公司");
                tn.Text = dr[i]["name"].ToString();
                tn.Name = dr[i]["levers"].ToString();
                tn.Tag = dr[i]["leverid"].ToString();
                if (dr[i]["levers"].ToString() == "1")
                {
                    FillTree4(tn, dt);
                }
                treeView1.Nodes.Add(tn);
            }
        }

        private void FillTree4(TreeNode node, DataTable dt)
        {
            int levers = int.Parse(node.Name)+1;
            string sql = "leverid like '%" + node.Tag.ToString() + "%' and levers="+levers+"";
            DataRow[] dd = dt.Select(sql);
            if (dd.Length >0)
            {
                for (int i = 0; i < dd.Length; i++)
                {
                    TreeNode tn = new TreeNode();
                    if (dd[i]["leverid"].ToString().Substring(0, node.Tag.ToString().Length) == node.Tag.ToString())
                    {                       
                        tn.Text = dd[i]["name"].ToString();
                        tn.Name = dd[i]["levers"].ToString();
                        tn.Tag = dd[i]["leverid"].ToString();
                        if (dd[i]["levers"].ToString() == levers+"")
                        {
                            FillTree4(tn, dt);
                        }
                        node.Nodes.Add(tn);
                    }
                   
                }
            }
        }


#12


看LZ满不满意。。

#13


这个方法要修改一下,,上面第一层总公司没有绑上去。。如下
   private void bindTreeView4()
        {
            string sql = "select * from test";
            DataTable dt = db.ExecuteDataTable(sql, CommandType.Text, null);
            DataRow[] dr = dt.Select("levers='1'");
            TreeNode Fisrt = new TreeNode("总公司");
            treeView1.Nodes.Add(Fisrt);
            for (int i = 0; i < dr.Length; i++)
            {   
                TreeNode tn = new TreeNode();
                tn.Text = dr[i]["name"].ToString();
                tn.Name = dr[i]["levers"].ToString();
                tn.Tag = dr[i]["leverid"].ToString();
                if (dr[i]["levers"].ToString() == "1")
                {
                    FillTree4(tn, dt);
                }
                Fisrt.Nodes.Add(tn);
            }           
        }

#14


引用 13 楼 happy09li 的回复:
这个方法要修改一下,,上面第一层总公司没有绑上去。。如下
C# code
   private void bindTreeView4()
        {
            string sql = "select * from test";
            DataTable dt = db.ExecuteDataTable(sql, CommandType.Text, n……

用了在treeview不能分级啊,全部节点都在一个层

#15



CREATE TABLE [dbo].[Company] (
[Id] [int] IDENTITY (1, 1)  Primary Key NOT NULL ,
[Levers] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[LevelId] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
)

Winform中的Treeview动态绑定数据库

public partial class Form1 : Form
    {
        public string rootId = "-1";

        public Form1()
        {
            InitializeComponent();
            AddRootCompany(rootId);
            AddSubCompany();
        }

        /// <summary>
        /// 添加总公司
        /// </summary>
        /// <param name="rootId"></param>
        private void AddRootCompany(string rootId)
        {
            DataSet ds = new DataSet();
            using (SqlConnection con = new SqlConnection("Data Source=localhost;uid=sa;pwd=saiyang;Database=CSDN"))
            {
                con.Open();
                string strSQL = "select * from Company where Levers='" + rootId + "'";
                using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, con))
                {
                    adapter.Fill(ds);
                }
                TreeNode NewNode = new TreeNode();
                NewNode.Text = ds.Tables[0].Rows[0]["Name"].ToString().Trim();
                this.treeView1.Nodes.Add(NewNode);
            }
        }

        /// <summary>
        /// 添加子公司
        /// </summary>
        private void AddSubCompany()
        {
            DataSet ds = getMenuByLevel(rootId.ToString());
            for (int j = 0; j < ds.Tables[0].Rows.Count; j++)
            {
                InitTreeCompanyChildNode(treeView1.Nodes[j], ds.Tables[0].Rows[j]["LevelId"].ToString());
            }

        }

        /// <summary>
        /// 获取层次级别
        /// </summary>
        /// <param name="getparams"></param>
        /// <returns></returns>
        public DataSet getMenuByLevel(string param)
        {
            DataSet ds = new DataSet();
            using (SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=CSDN;User ID=sa;Password=saiyang"))
            {
                con.Open();
                string strSQL = "select * from Company where Levers='" + param + "'";
                using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, con))
                {
                    adapter.Fill(ds);
                }
            }
            return ds;
        }

        /// <summary>
        /// 递归获取子节点
        /// </summary>
        /// <param name="PNode"></param>
        /// <param name="classParentID"></param>
        private void InitTreeCompanyChildNode(TreeNode pNode, string classParentID)
        {
            DataSet ds = getMenuByLevel(classParentID);
            DataView dataView = new DataView();
            dataView = ds.Tables[0].DefaultView;
            foreach (DataRowView drv in dataView)
            {
                string id = drv["LevelId"].ToString();
                string name = drv["Name"].ToString();
                TreeNode NewNode = new TreeNode();
                //将子公司添加到父节点下面
                NewNode.Text = name;
                pNode.Nodes.Add(NewNode);
                InitTreeCompanyChildNode(NewNode, id);
            }
        }

    }

Winform中的Treeview动态绑定数据库

#16


引用 15 楼 taomanman 的回复:
SQL code

CREATE TABLE [dbo].[Company] (
    [Id] [int] IDENTITY (1, 1)  Primary Key NOT NULL ,
    [Levers] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [LevelId] [varchar] (50) COLLATE Chin……

我的表里面Levers是int类型并且表示的是节点所在的层数,根节点是-1,根节点的子节点是1.....
你的算法Levers表示的是父节点ID啊!
还能帮我修改一下你的算法吗?我的表老师不给改(在帮老师做他找来的项目)...
麻烦你了,另外再给你加50分,100全给你,多谢,分就这个多了!

#17


引用 15 楼 taomanman 的回复:
SQL code

CREATE TABLE [dbo].[Company] (
    [Id] [int] IDENTITY (1, 1)  Primary Key NOT NULL ,
    [Levers] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [LevelId] [varchar] (50) COLLATE Chin……

自己改成功了,多谢你帮忙!

#18


引用 17 楼 z4213489 的回复:
引用 15 楼 taomanman 的回复:

SQL code

CREATE TABLE [dbo].[Company] (
[Id] [int] IDENTITY (1, 1)  Primary Key NOT NULL ,
[Levers] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[LevelId] [varchar]……

能自己改出来最好了,呵呵。
这个最主要的是递归的使用。

搞出来的话,可以将代码贴出来,方便后来有同样需求的童鞋学习参考,只是个建议,呵呵。

#1


#2


怎么只有一个链接没有直接显示图片啊!

#3


引用 2 楼 z4213489 的回复:
怎么只有一个链接没有直接显示图片啊!

那是贴的连接
Winform中的Treeview动态绑定数据库

#4


引用 1 楼 taomanman 的回复:
http://topic.csdn.net/u/20110621/17/7bad3c94-2761-4d39-84fa-db95b8e66977.html

你的方法只能一层写代码,我的数据表是无限分层的。。
按你的思路我看看能不能写个递归方法实现绑定。。
如果可以你能帮写个?

#5


写不出来啊。。。哪个高手帮忙写个递归算法
或者能实现我要求的代码也行啊

#6


求高手解决啊!

#7


递归 像这样http://www.360doc.com/content/10/0830/16/2801906_49918583.shtml

#8


levelid 应该改成parentid 这样就可以用递归来做了!

#9


“定义的表如上:
Levels表示的是节点层数,-1为根节点,1为第一层的节点。。。。
levelstr表示节点描述,00是根节点,0101位第一层第一个节点,0102是第一层第二个节点。。。”

你都把思路描述出来了,那里从DataTable取出数据后,一个一个动态创建数据不就可以实现了吗?

#10


引用 8 楼 rqx110 的回复:
levelid 应该改成parentid 这样就可以用递归来做了!

这个表不能变,我也蛋疼呢,其他模块涉及到这个表
现在不能解决的问题是怎么获取某个节点所有子节点的数据项!

#11


自己刚刚写完,,绑了四级,,部分代码写的不够规范可以优化下。。。

 private void bindTreeView4()
        {
            string sql = "select * from test";
            DataTable dt = db.ExecuteDataTable(sql, CommandType.Text, null);
            DataRow[] dr = dt.Select("levers='1'");
            
            for (int i = 0; i < dr.Length; i++)
            {   
                TreeNode tn = new TreeNode("总公司");
                tn.Text = dr[i]["name"].ToString();
                tn.Name = dr[i]["levers"].ToString();
                tn.Tag = dr[i]["leverid"].ToString();
                if (dr[i]["levers"].ToString() == "1")
                {
                    FillTree4(tn, dt);
                }
                treeView1.Nodes.Add(tn);
            }
        }

        private void FillTree4(TreeNode node, DataTable dt)
        {
            int levers = int.Parse(node.Name)+1;
            string sql = "leverid like '%" + node.Tag.ToString() + "%' and levers="+levers+"";
            DataRow[] dd = dt.Select(sql);
            if (dd.Length >0)
            {
                for (int i = 0; i < dd.Length; i++)
                {
                    TreeNode tn = new TreeNode();
                    if (dd[i]["leverid"].ToString().Substring(0, node.Tag.ToString().Length) == node.Tag.ToString())
                    {                       
                        tn.Text = dd[i]["name"].ToString();
                        tn.Name = dd[i]["levers"].ToString();
                        tn.Tag = dd[i]["leverid"].ToString();
                        if (dd[i]["levers"].ToString() == levers+"")
                        {
                            FillTree4(tn, dt);
                        }
                        node.Nodes.Add(tn);
                    }
                   
                }
            }
        }


#12


看LZ满不满意。。

#13


这个方法要修改一下,,上面第一层总公司没有绑上去。。如下
   private void bindTreeView4()
        {
            string sql = "select * from test";
            DataTable dt = db.ExecuteDataTable(sql, CommandType.Text, null);
            DataRow[] dr = dt.Select("levers='1'");
            TreeNode Fisrt = new TreeNode("总公司");
            treeView1.Nodes.Add(Fisrt);
            for (int i = 0; i < dr.Length; i++)
            {   
                TreeNode tn = new TreeNode();
                tn.Text = dr[i]["name"].ToString();
                tn.Name = dr[i]["levers"].ToString();
                tn.Tag = dr[i]["leverid"].ToString();
                if (dr[i]["levers"].ToString() == "1")
                {
                    FillTree4(tn, dt);
                }
                Fisrt.Nodes.Add(tn);
            }           
        }

#14


引用 13 楼 happy09li 的回复:
这个方法要修改一下,,上面第一层总公司没有绑上去。。如下
C# code
   private void bindTreeView4()
        {
            string sql = "select * from test";
            DataTable dt = db.ExecuteDataTable(sql, CommandType.Text, n……

用了在treeview不能分级啊,全部节点都在一个层

#15



CREATE TABLE [dbo].[Company] (
[Id] [int] IDENTITY (1, 1)  Primary Key NOT NULL ,
[Levers] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[LevelId] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
)

Winform中的Treeview动态绑定数据库

public partial class Form1 : Form
    {
        public string rootId = "-1";

        public Form1()
        {
            InitializeComponent();
            AddRootCompany(rootId);
            AddSubCompany();
        }

        /// <summary>
        /// 添加总公司
        /// </summary>
        /// <param name="rootId"></param>
        private void AddRootCompany(string rootId)
        {
            DataSet ds = new DataSet();
            using (SqlConnection con = new SqlConnection("Data Source=localhost;uid=sa;pwd=saiyang;Database=CSDN"))
            {
                con.Open();
                string strSQL = "select * from Company where Levers='" + rootId + "'";
                using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, con))
                {
                    adapter.Fill(ds);
                }
                TreeNode NewNode = new TreeNode();
                NewNode.Text = ds.Tables[0].Rows[0]["Name"].ToString().Trim();
                this.treeView1.Nodes.Add(NewNode);
            }
        }

        /// <summary>
        /// 添加子公司
        /// </summary>
        private void AddSubCompany()
        {
            DataSet ds = getMenuByLevel(rootId.ToString());
            for (int j = 0; j < ds.Tables[0].Rows.Count; j++)
            {
                InitTreeCompanyChildNode(treeView1.Nodes[j], ds.Tables[0].Rows[j]["LevelId"].ToString());
            }

        }

        /// <summary>
        /// 获取层次级别
        /// </summary>
        /// <param name="getparams"></param>
        /// <returns></returns>
        public DataSet getMenuByLevel(string param)
        {
            DataSet ds = new DataSet();
            using (SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=CSDN;User ID=sa;Password=saiyang"))
            {
                con.Open();
                string strSQL = "select * from Company where Levers='" + param + "'";
                using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, con))
                {
                    adapter.Fill(ds);
                }
            }
            return ds;
        }

        /// <summary>
        /// 递归获取子节点
        /// </summary>
        /// <param name="PNode"></param>
        /// <param name="classParentID"></param>
        private void InitTreeCompanyChildNode(TreeNode pNode, string classParentID)
        {
            DataSet ds = getMenuByLevel(classParentID);
            DataView dataView = new DataView();
            dataView = ds.Tables[0].DefaultView;
            foreach (DataRowView drv in dataView)
            {
                string id = drv["LevelId"].ToString();
                string name = drv["Name"].ToString();
                TreeNode NewNode = new TreeNode();
                //将子公司添加到父节点下面
                NewNode.Text = name;
                pNode.Nodes.Add(NewNode);
                InitTreeCompanyChildNode(NewNode, id);
            }
        }

    }

Winform中的Treeview动态绑定数据库

#16


引用 15 楼 taomanman 的回复:
SQL code

CREATE TABLE [dbo].[Company] (
    [Id] [int] IDENTITY (1, 1)  Primary Key NOT NULL ,
    [Levers] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [LevelId] [varchar] (50) COLLATE Chin……

我的表里面Levers是int类型并且表示的是节点所在的层数,根节点是-1,根节点的子节点是1.....
你的算法Levers表示的是父节点ID啊!
还能帮我修改一下你的算法吗?我的表老师不给改(在帮老师做他找来的项目)...
麻烦你了,另外再给你加50分,100全给你,多谢,分就这个多了!

#17


引用 15 楼 taomanman 的回复:
SQL code

CREATE TABLE [dbo].[Company] (
    [Id] [int] IDENTITY (1, 1)  Primary Key NOT NULL ,
    [Levers] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [LevelId] [varchar] (50) COLLATE Chin……

自己改成功了,多谢你帮忙!

#18


引用 17 楼 z4213489 的回复:
引用 15 楼 taomanman 的回复:

SQL code

CREATE TABLE [dbo].[Company] (
[Id] [int] IDENTITY (1, 1)  Primary Key NOT NULL ,
[Levers] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[LevelId] [varchar]……

能自己改出来最好了,呵呵。
这个最主要的是递归的使用。

搞出来的话,可以将代码贴出来,方便后来有同样需求的童鞋学习参考,只是个建议,呵呵。