zoukankan      html  css  js  c++  java
  • 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 = "";
    }

    添加根节点代码


    复制代码
     1 private void btnAddRootNode_Click(object sender, EventArgs e)
     2   {
     3       //要添加的节点名称为空,即文本框是否为空
     4         if(string.IsNullOrEmpty(txtNodeName.Text.Trim()))
     5          {
     6              MessageBox.Show("要添加的节点名称不能为空!");
     7              return;
     8          }
     9             //添加根节点
    10             treeView1.Nodes.Add(txtNodeName.Text.Trim());
    11            txtNodeName.Text = "";
    12   }
    复制代码

    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 = "";
    }

    添加子节点代码


    复制代码
     1 private void btnAddSonNode_Click(object sender, EventArgs e)
     2    {
     3        //要添加的节点名称为空,即文本框是否为空
     4         if (string.IsNullOrEmpty(txtNodeName.Text.Trim()))
     5          {
     6              MessageBox.Show("要添加的节点名称不能为空!");
     7               return;
     8          }
     9          if(treeView1.SelectedNode==null)
    10           {
    11              MessageBox.Show("请选择要添加子节点的节点!");
    12               return;
    13           }               treeView1.SelectedNode.Nodes.Add(txtNodeName.Text.Trim());
    14     txtNodeName.Text = "";
    15    }
    复制代码

    2.3删除选中节点

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

    删除选中节点代码


    复制代码
    1  private void btnDelete_Click(object sender, EventArgs e)
    2   {
    3       if (treeView1.SelectedNode == null)
    4          {
    5               MessageBox.Show("请选择要删除的节点!");
    6               return;
    7          }
    8             treeView1.SelectedNode.Remove();
    9   }
    复制代码

    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
    )

    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 = "";
    }

    添加根节点


    复制代码
     1  private void btnAddRootNode_Click (object sender, EventArgs e)
     2   {
     3         if(string.IsNullOrEmpty(txtNodeName.Text.Trim()))
     4          {
     5              MessageBox.Show("请填写要添加的节点名称!");
     6               return;
     7          }
     8   string sql = "insert into TreeTest(nodeName,parentId) output inserted.id values"+"("+" "+"'"+ txtNodeName.Text.Trim()+"'"+","+"'"+0+"'"+")";
     9             int id = (int)sqlHelper.ExecuteScalar(sql);
    10             TreeNode node1 = new TreeNode();
    11             node1.Tag = id;//把自己的id存放在该节点tag对象里
    12             node1.Text = txtNodeName.Text.Trim();
    13             treeView1.Nodes.Add(node1);
    14             txtNodeName.Text = "";
    15         }
    复制代码

    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 = "";
    }

    添加子节点


    复制代码
     1 private void btnAddSonNode_Click (object sender, EventArgs e)
     2    {
     3             int id;
     4             if(string.IsNullOrEmpty(txtNodeName.Text.Trim()))
     5             {
     6                 return;
     7             }
     8             if(treeView1.SelectedNode==null)
     9             {
    10                 MessageBox.Show("请选择父节点");
    11                 return;
    12             }
    13             id =(int)treeView1.SelectedNode.Tag;//获取父id
    14             string sql = "insert into TreeTest(nodeName,parentId) output inserted.id values"+"(" + " " + "'" + txtNodeName.Text.Trim() + "'" + "," + "'" + id + "'" + ")";
    15             int id1 = (int)sqlHelper.ExecuteScalar(sql);
    16             TreeNode node1 = new TreeNode();
    17             node1.Tag = id1;
    18             node1.Text = txtNodeName.Text.Trim();
    19             treeView1.SelectedNode.Nodes.Add(node1);
    20             txtNodeName.Text = "";
    21  }
    复制代码

    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);
    }

    }

    }

    动态加载数据代码


    复制代码
     1 private void Form3_Load(object sender, EventArgs e)
     2  {      
     3      //加载数据,把数据加载到控件treeview1中   
     4      setTreeView(treeView1, 0);           
     5  }
     6 
     7  //调用的时候parentId以0值开始 setTreeView(treeView1, 0);
     8   private void setTreeView(TreeView tr1,int parentId)
     9  {
    10   string sql = "select * from TreeTest where parentId=" + parentId;
    11       DataTable ds= sqlHelper.ExecuteDataTable(sql);
    12        if (ds.Rows.Count > 0)
    13         {
    14                int pId = -1;
    15              foreach (DataRow row in ds.Rows)
    16                {
    17                     TreeNode node = new TreeNode();
    18                     node.Text = row["nodeName"].ToString();
    19                     node.Tag = (int)row["id"];
    20                     pId = (int)row["parentId"];
    21                     if (pId == 0)
    22                     {
    23                         //添加根节点
    24                         tr1.Nodes.Add(node);
    25                     }
    26                     else
    27                     {
    28                         //添加根节点之外的其他节点
    29                         RefreshChildNode(tr1,node,pId);
    30                     }
    31                     //查找以node为父节点的子节点
    32                     setTreeView(tr1,(int)node.Tag);
    33 
    34                 }
    35             }
    36 
    37    }
    38 //处理根节点的子节点
    39   private void RefreshChildNode(TreeView tr1,TreeNode treeNode, int parentId)
    40  {
    41          foreach (TreeNode node in tr1.Nodes)
    42             {
    43                 if((int)node.Tag==parentId)
    44                 {
    45                     node.Nodes.Add(treeNode);
    46                     return;
    47                 }else if (node.Nodes.Count > 0)
    48                 {
    49                     FindChildNode(node, treeNode,  parentId);
    50                 }
    51             }
    52  }
    53 
    54   //处理根节点的子节点的子节点
    55   private void FindChildNode(TreeNode  tNode,TreeNode treeNode, int parentId)
    56  {
    57          foreach (TreeNode node in tNode.Nodes)
    58           {
    59                 if ((int)node.Tag == parentId)
    60                 {
    61                     node.Nodes.Add(treeNode);
    62                     return;
    63                 }else if (node.Nodes.Count > 0)
    64                 {
    65                     FindChildNode(node,treeNode,parentId);
    66                 }
    67 
    68             }
    69 
    70 }
    复制代码

    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);
    }
    }

    删除节点代码


    复制代码
     1  private void btnDelete_Click(object sender, EventArgs e)
     2    {
     3          if(treeView1.SelectedNode==null)
     4          {
     5                 MessageBox.Show("请选择要删除的节点!");
     6                 return;
     7            }
     8             //选中节点的id,也是其子节点的parentId
     9             int id = (int)treeView1.SelectedNode.Tag;
    10             nodeDelete(id);//递归删除数据表中的数据
    11             treeView1.SelectedNode.Remove();//删除控件中的节点
    12 
    13   }
    14    //数据表中的数据的递归删除方法
    15    public void nodeDelete(int id)
    16  {
    17             string sql = "select * from TreeTest where parentId="+id;
    18             DataTable ds = sqlHelper.ExecuteDataTable(sql);
    19             if (ds.Rows.Count > 0)
    20             {
    21                 //有子节点
    22                 foreach(DataRow row in ds.Rows)
    23                 {
    24                     //先删除父节点
    25                     string delete = "delete from TreeTest where id=" + id;
    26                     int k = sqlHelper.ExecuteNonQuery(delete);
    27                     //查找子节点,删除
    28                     int id1 = (int)row["id"];
    29                     nodeDelete(id1);
    30                 }
    31             }
    32             else
    33             { 
    34                //没有子节点
    35                 string delete = "delete from TreeTest where id="+id;
    36                 int k = sqlHelper.ExecuteNonQuery(delete);
    37             }
    38 }
    复制代码

    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窗体代码


    复制代码
     1 public partial class Form4 : Form
     2  {
     3         public string nodeName
     4         {
     5             get { return textBox1.Text.Trim(); }
     6         }
     7         public Form4()
     8         {
     9             InitializeComponent();
    10         }
    11 
    12         private void btnCancel_Click(object sender, EventArgs e)
    13         {
    14             DialogResult = DialogResult.Cancel;
    15         }
    16 
    17         private void btnConfirm_Click(object sender, EventArgs e)
    18         {
    19             if(string.IsNullOrEmpty(textBox1.Text.Trim()))
    20             {
    21                 MessageBox.Show("请填写节点名称!");
    22                 return;
    23             }
    24             DialogResult = DialogResult.OK;
    25         }
    26 }
    复制代码

    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窗体代码


    复制代码
     1 public partial class Form3 : Form
     2     {
     3         public Form3()
     4         {
     5             InitializeComponent();
     6         }
     7         private void treeView1_MouseDown(object sender, MouseEventArgs e)
     8         {
     9             if(e.Button==MouseButtons.Right)
    10             {
    11                 Point ClickPoint = new Point(e.X, e.Y);
    12                 int x = e.X;
    13                 int y = e.Y;
    14                 TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint);
    15                 if (CurrentNode is TreeNode)//判断你点的是不是一个节点
    16                 {               
    17                     treeView1.SelectedNode = CurrentNode;
    18                     CurrentNode.ContextMenuStrip = this.contextMenuStrip1;                    
    19                     contextMenuStrip1.Show(MousePosition);
    20                 }
    21                 else
    22                 {
    23                     treeView1.ContextMenuStrip = this.contextMenuStrip2;
    24                     contextMenuStrip2.Show(MousePosition);
    25                 }
    26             }
    27         }
    28 
    29         private void 添加子节点ToolStripMenuItem_Click(object sender, EventArgs e)
    30         {
    31             Form4 f5 = new Form4();
    32             if (f5.ShowDialog() == DialogResult.OK)
    33             {
    34               treeView1.SelectedNode.Nodes.Add(f5.nodeName);
    35             }
    36         }
    37 
    38         private void 删除选中节点ToolStripMenuItem_Click(object sender, EventArgs e)
    39         {
    40             treeView1.SelectedNode.Remove();
    41         }
    42 
    43         private void 添加根节点ToolStripMenuItem1_Click(object sender, EventArgs e)
    44         {
    45             Form4 f4 = new Form4();
    46             if (f4.ShowDialog() == DialogResult.OK)
    47             {
    48                 treeView1.Nodes.Add(f4.nodeName);
    49             }
    50         }
    51 
    52         private void 清空ToolStripMenuItem1_Click(object sender, EventArgs e)
    53         {
    54             treeView1.Nodes.Clear();
    55         }
    56     }
  • 相关阅读:
    opencv(8)直方图操作
    opencv(9)直方图均衡化,对比,匹配
    最近没有更新日记
    dsp 链接命令文件的写法
    sqlserver 的数据库备份 还原安全操作 备忘录
    主板的各种抱错声音
    hibernate 的自动生成工具
    如何学习,如何提出问题,如何解决问题,如何脑筋急转弯
    framework 的 错误提示?
    hack 入侵 142 主机的过程
  • 原文地址:https://www.cnblogs.com/liuxingleiyu/p/6231387.html
Copyright © 2011-2022 走看看