C# TreeView 控件的综合使用方法

1、概述

    该篇文章开发使用的语言c#,环境visualstudio2010,sql数据库.主要内容包括:

(1)、treeView控件添加根节点、子节点的基本方法,节点的删除。

(2)、把treeView控件的节点数据保存到SQL数据包括中,把数据库数据表中的数据动态加载到treeView控件中,控件节点的递归删除(指的是递归删除数据表的数据)

 

2、TreeView控件的基本用法

     为了演示相关方法、属性的用法,通过vs2010创建一个winform项目,在项目中添加一个窗体,其布局如图2-1所示

                                                                                   图2-1

 

        其中TreeView控件的名称为:treeview1,文本框的名称为:txtNodeName,“添加根节点”按钮的名称为:btnAddRootNode,“添加子节点”按钮的名称为:btnAddSonNode,“删除选中节点”按钮的名称:btnDelete

添加节点、删除节点的代码如下所示:

2.1添加根节点

private void btnAddRootNode_Click(object sender, EventArgs e)
  {
      //要添加的节点名称为空,即文本框是否为空
        if(string.IsNullOrEmpty(txtNodeName.Text.Trim()))
         {
             MessageBox.Show("要添加的节点名称不能为空!");
             return;
         }
            //添加根节点
            treeView1.Nodes.Add(txtNodeName.Text.Trim());
           txtNodeName.Text = "";
  }

添加根节点代码

 2.2添加子节点

private void btnAddSonNode_Click(object sender, EventArgs e)
   {
       //要添加的节点名称为空,即文本框是否为空
        if (string.IsNullOrEmpty(txtNodeName.Text.Trim()))
         {
             MessageBox.Show("要添加的节点名称不能为空!");
              return;
         }
         if(treeView1.SelectedNode==null)
          {
             MessageBox.Show("请选择要添加子节点的节点!");
              return;
          }               
          treeView1.SelectedNode.Nodes.Add(txtNodeName.Text.Trim());
          txtNodeName.Text = "";
   }

添加子节点代码

2.3删除选中节点

private void btnDelete_Click(object sender, EventArgs e)
  {
      if (treeView1.SelectedNode == null)
         {
              MessageBox.Show("请选择要删除的节点!");
              return;
         }
            treeView1.SelectedNode.Remove();
  }

删除选中节点代码

 

3、TreeView控件在树形菜单中的应用

        Treeview在产品类别管理、部门管理等树状多级菜单中的应用,主要包括把树控件中的数据保存到SQL数据表中,把数据表中的数据动态加载到treeview控件中,以及删除控件节点及数据表中的数据。

3.1 数据表

create table TreeTest
(
 id int identity(1,1) primary key not null,//节点id
 nodeName nvarchar(50) not null,//节点名称
 parentId int not null//节点父id
)

3.2 把节点数据存储到数据表

        把treeView添加的节点信息存储到数据表,包括根节点、子节点,所用的窗体界面如图2-1所示,控件的名称保持不变,只是执行代码变了。

         添加根节点

private void btnAddRootNode_Click (object sender, EventArgs e)
  {
        if(string.IsNullOrEmpty(txtNodeName.Text.Trim()))
         {
             MessageBox.Show("请填写要添加的节点名称!");
              return;
         }
  string sql = "insert into TreeTest(nodeName,parentId) output inserted.id values"+"("+" "+"'"+ txtNodeName.Text.Trim()+"'"+","+"'"+0+"'"+")";
            int id = (int)sqlHelper.ExecuteScalar(sql);
            TreeNode node1 = new TreeNode();
            node1.Tag = id;//把自己的id存放在该节点tag对象里
            node1.Text = txtNodeName.Text.Trim();
            treeView1.Nodes.Add(node1);
            txtNodeName.Text = "";
        }

添加根节点

 添加子节点

private void btnAddSonNode_Click (object sender, EventArgs e)
   {
            int id;
            if(string.IsNullOrEmpty(txtNodeName.Text.Trim()))
            {
                return;
            }
            if(treeView1.SelectedNode==null)
            {
                MessageBox.Show("请选择父节点");
                return;
            }
            id =(int)treeView1.SelectedNode.Tag;//获取父id
            string sql = "insert into TreeTest(nodeName,parentId) output inserted.id values"+"(" + " " + "'" + txtNodeName.Text.Trim() + "'" + "," + "'" + id + "'" + ")";
            int id1 = (int)sqlHelper.ExecuteScalar(sql);
            TreeNode node1 = new TreeNode();
            node1.Tag = id1;
            node1.Text = txtNodeName.Text.Trim();
            treeView1.SelectedNode.Nodes.Add(node1);
            txtNodeName.Text = "";
 }

添加子节点

3.3动态加载数据

    把数据表中的数据动态加载到treeView控件中,在treeView所在窗体的load事件中加载,相应的代码如下所示

private void Form3_Load(object sender, EventArgs e)
 {      
     //加载数据,把数据加载到控件treeview1中   
     setTreeView(treeView1, 0);           
 }

 //调用的时候parentId以0值开始 setTreeView(treeView1, 0);
  private void setTreeView(TreeView tr1,int parentId)
 {
      string sql = "select * from TreeTest where parentId=" + parentId;
      DataTable ds= sqlHelper.ExecuteDataTable(sql);
       if (ds.Rows.Count > 0)
        {
             int pId = -1;
             foreach (DataRow row in ds.Rows)
               {
                    TreeNode node = new TreeNode();
                    node.Text = row["nodeName"].ToString();
                    node.Tag = (int)row["id"];
                    pId = (int)row["parentId"];
                    if (pId == 0)
                    {
                        //添加根节点
                        tr1.Nodes.Add(node);
                    }
                    else
                    {
                        //添加根节点之外的其他节点
                        RefreshChildNode(tr1,node,pId);
                    }
                    //查找以node为父节点的子节点
                    setTreeView(tr1,(int)node.Tag);

                }
            }

   }
//处理根节点的子节点
  private void RefreshChildNode(TreeView tr1,TreeNode treeNode, int parentId)
 {
         foreach (TreeNode node in tr1.Nodes)
            {
                if((int)node.Tag==parentId)
                {
                    node.Nodes.Add(treeNode);
                    return;
                }else if (node.Nodes.Count > 0)
                {
                    FindChildNode(node, treeNode,  parentId);
                }
            }
 }

  //处理根节点的子节点的子节点
  private void FindChildNode(TreeNode  tNode,TreeNode treeNode, int parentId)
 {
         foreach (TreeNode node in tNode.Nodes)
          {
                if ((int)node.Tag == parentId)
                {
                    node.Nodes.Add(treeNode);
                    return;
                }else if (node.Nodes.Count > 0)
                {
                    FindChildNode(node,treeNode,parentId);
                }

            }

}

动态加载数据代码

3.4、递归删除节点,这里指的是递归删除节点在数据表中的信息

private void btnDelete_Click(object sender, EventArgs e)
   {
         if(treeView1.SelectedNode==null)
         {
                MessageBox.Show("请选择要删除的节点!");
                return;
           }
            //选中节点的id,也是其子节点的parentId
            int id = (int)treeView1.SelectedNode.Tag;
            nodeDelete(id);//递归删除数据表中的数据
            treeView1.SelectedNode.Remove();//删除控件中的节点

  }
   //数据表中的数据的递归删除方法
   public void nodeDelete(int id)
 {
            string sql = "select * from TreeTest where parentId="+id;
            DataTable ds = sqlHelper.ExecuteDataTable(sql);
            if (ds.Rows.Count > 0)
            {
                //有子节点
                foreach(DataRow row in ds.Rows)
                {
                    //先删除父节点
                    string delete = "delete from TreeTest where id=" + id;
                    int k = sqlHelper.ExecuteNonQuery(delete);
                    //查找子节点,删除
                    int id1 = (int)row["id"];
                    nodeDelete(id1);
                }
            }
            else
            { 
               //没有子节点
                string delete = "delete from TreeTest where id="+id;
                int k = sqlHelper.ExecuteNonQuery(delete);
            }
}

删除节点代码

4、TreeView控件的右键操作

        TreeView控件的右键操作,需要两个winform窗体form3(图4-1),form4(图4-2),其中form3中放置treeview1控件,两个contextMenuStrip,contextMenuStrip1和contextMenuStrip2,form4用于弹出菜单 填写要添加节点名称

                                                                                         图4-1

                                                                                         图4-2

                                                                                       contextMenuStrip1

                                                                                        contextMenuStrip2

 

4.1 Form4窗体的代码如下:

public partial class Form4 : Form
 {
        public string nodeName
        {
            get { return textBox1.Text.Trim(); }
        }
        public Form4()
        {
            InitializeComponent();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
        }

        private void btnConfirm_Click(object sender, EventArgs e)
        {
            if(string.IsNullOrEmpty(textBox1.Text.Trim()))
            {
                MessageBox.Show("请填写节点名称!");
                return;
            }
            DialogResult = DialogResult.OK;
        }
}

form4窗体代码

4.2 form3窗体的代码如下:

public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        private void treeView1_MouseDown(object sender, MouseEventArgs e)
        {
            if(e.Button==MouseButtons.Right)
            {
                Point ClickPoint = new Point(e.X, e.Y);
                int x = e.X;
                int y = e.Y;
                TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint);
                if (CurrentNode is TreeNode)//判断你点的是不是一个节点
                {               
                    treeView1.SelectedNode = CurrentNode;
                    CurrentNode.ContextMenuStrip = this.contextMenuStrip1;                    
                    contextMenuStrip1.Show(MousePosition);
                }
                else
                {
                    treeView1.ContextMenuStrip = this.contextMenuStrip2;
                    contextMenuStrip2.Show(MousePosition);
                }
            }
        }

        private void 添加子节点ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form4 f5 = new Form4();
            if (f5.ShowDialog() == DialogResult.OK)
            {
              treeView1.SelectedNode.Nodes.Add(f5.nodeName);
            }
        }

        private void 删除选中节点ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            treeView1.SelectedNode.Remove();
        }

        private void 添加根节点ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form4 f4 = new Form4();
            if (f4.ShowDialog() == DialogResult.OK)
            {
                treeView1.Nodes.Add(f4.nodeName);
            }
        }

        private void 清空ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
        }
    }

form3窗体代码

4.3、示例中用到的sqlHelper.cs文件代码如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace CRMProject.DAL
{
    class SqlHelper
    {
        static DataTable  dtInfo = new DataTable();    
        public static SqlConnection My_con;  //定义一个sqlConnection类型的公共变量My_con,用于判断数据库是否连接成功


        public static readonly string connstr = 
            ConfigurationManager.ConnectionStrings["dbconnstr"].ConnectionString;

 public static int ExecuteNonQuery(string cmdText,
            params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = cmdText;
                    cmd.CommandTimeout = 3000;
                    cmd.Parameters.AddRange(parameters);
                    return cmd.ExecuteNonQuery();
                }
            }
        }

  public static void dgrd_Connection(string strSql, DataGridView dgrd, int start, int pagesize, string tableName)
        {

            try
            {
                SqlDataAdapter adapter = new SqlDataAdapter(strSql, getcon());
                DataSet dataSet = new DataSet();
                adapter.Fill(dataSet, start, pagesize, tableName);
                dtInfo = dataSet.Tables[tableName];
                dgrd.DataSource = dataSet.Tables[tableName];
                dgrd.AllowUserToAddRows = false;

            }
            catch { }
        }

        public static SqlConnection getcon()
        {


            My_con = new SqlConnection(connstr);   //用SqlConnection对象与指定的数据库相连接
            My_con.Open();  //打开数据库连接
            return My_con;  //返回SqlConnection对象的信息              


        }
        public static int Count(string strSql)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    try
                    {
                        cmd.CommandText = strSql;
                        cmd.CommandTimeout = 3000;
                        int n = int.Parse(cmd.ExecuteScalar().ToString());
                        return n;

                    }
                    catch { return 0; }
                }
            }
        }
        public static object ExecuteScalar(string cmdText,
            params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = cmdText;
                    cmd.CommandTimeout = 3000;
                    cmd.Parameters.AddRange(parameters);
                    return cmd.ExecuteScalar();
                }
            }
        }

        public static DataTable ExecuteDataTable(string cmdText,
            params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = cmdText;
                    cmd.CommandTimeout = 3000;
                    cmd.Parameters.AddRange(parameters);
                    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
                    {
                        DataTable dt = new DataTable();
                        adapter.Fill(dt);
                        return dt;
                    }
                }
            }
        }

        public static SqlDataReader ExecuteDataReader(string cmdText,
            params SqlParameter[] parameters)
        {
            SqlConnection conn = new SqlConnection(connstr);
            conn.Open();
            using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = cmdText;
                cmd.CommandTimeout = 3000;
                cmd.Parameters.AddRange(parameters);
                return cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
        }
    }
}

sqlhelper.cs

 5、源码下载地址

链接:http://pan.baidu.com/s/1mi5DGi0   密码:t22u

https://www.cnblogs.com/net064/p/5534697.html

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TreeView件是Windows Forms中的一个件,它用于显示层次结构数据,如文件夹结构、组织机构和分类目录等。TreeView件提供了一种简单而有效的方式来显示和管理这些数据。以下是TreeView件的使用详解: 1. 添加TreeView件到窗体 在Visual Studio的工具箱中找到TreeView件,并将其拖放到窗体上。 2. 设置TreeView件的属性 TreeView件有许多可用的属性,可以在属性窗口中进行设置。其中一些常用的属性包括: - Nodes:TreeView件中的节点集合。 - ImageList:用于显示节点图像的ImageList件。 - CheckBoxes:指示是否显示节点前面的复选框。 - ShowLines:指示是否显示节点之间的连接线。 - ShowPlusMinus:指示是否显示展开和折叠节点的加号和减号。 - SelectedNode:表示当前选定的节点。 3. 添加节点 可以使用Nodes属性中的Add方法来添加节点。例如,以下代码将在TreeView件中添加一个名为“根节点”的节点: ``` c# treeView1.Nodes.Add("根节点"); ``` 可以在节点上使用Text属性来设置节点的文本。例如,以下代码将设置根节点的文本为“根节点”: ``` c# treeView1.Nodes[0].Text = "根节点"; ``` 可以使用Nodes属性的Add方法来添加子节点。例如,以下代码将在根节点下添加一个名为“子节点”的子节点: ``` c# treeView1.Nodes[0].Nodes.Add("子节点"); ``` 可以使用TreeView件的SelectedNode属性来获取或设置当前选定的节点。例如,以下代码将选定根节点: ``` c# treeView1.SelectedNode = treeView1.Nodes[0]; ``` 4. 设置节点图像 可以使用ImageList件来为节点设置图像。首先,需要将ImageList件添加到窗体上,并设置其ImageSize属性。然后,可以将图像添加到ImageList件中。例如,以下代码将设置TreeView件节点的图像: ``` c# // 创建一个ImageList件 ImageList imageList = new ImageList(); // 设置ImageSize属性 imageList.ImageSize = new Size(16, 16); // 添加图像 imageList.Images.Add("folder", Image.FromFile("folder.png")); // 将ImageList件赋给TreeView件的ImageList属性 treeView1.ImageList = imageList; // 在节点上设置图像 treeView1.Nodes[0].ImageKey = "folder"; ``` 5. 处理节点事件 TreeView件提供了许多事件,可以在事件处理程序中执行自定义代码。例如,以下代码将在单击节点时显示节点的文本: ``` c# private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { MessageBox.Show(e.Node.Text); } ``` 6. 总结 以上就是TreeView件的使用详解。TreeView件是一个非常实用的件,可以用来显示层次结构数据,如文件夹结构、组织机构和分类目录等。使用TreeView件,可以轻松地添加、删除和修改节点,以及处理节点事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值