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 }
C# TreeView 控件的综合使用方法的更多相关文章
- 【302】C# TreeView 控件使用说明
参考:C# 中treeview 树节点图标的动态加载,及选中时图标改变 参考:C# TreeView 控件的综合使用方法 参考:TreeView 类 参考:TreeNode 类 1. 添加根和子级 通 ...
- Win32中TreeView控件的使用方法,类似于资源管理器中文件树形显示方式
首先是头文件,内容如下: #include <tchar.h> #include "..\CommonFiles\CmnHdr.h" #include <Wind ...
- TreeView控件概述、属性与方法
1.作用:用于显示Node结点的分层列表.2.添加到控件箱菜单命令:工程 | 部件,在部件对话框中选择:Microsoft Windows Common Controls 6.03.TreeView控 ...
- WPF中TreeView控件SelectedItemChanged方法的MVVM绑定
问题描述:左侧treeview控件中点击不同类别的节点时,右侧的页面会显示不同的权限.比如对于My Publications,拥有Modify和Delete两种权限,对于My Subscription ...
- 树TreeView控件与DataTable交互添加节点(最高效的方法)
#region "读取树结点从Datatable" /// <summary> /// 读取树结点从Datatable" /// </summary&g ...
- 如何:使用TreeView控件实现树结构显示及快速查询
本文主要讲述如何通过使用TreeView控件来实现树结构的显示,以及树节点的快速查找功能.并针对通用树结构的数据结构存储进行一定的分析和设计.通过文本能够了解如何存储层次结构的数据库设计,如何快速使用 ...
- 基于Treeview控件遍历本地磁盘
一.前言 Treeview控件常用于遍历本地文件信息,通常与Datagridview与ImageList搭配.ImageList控件用于提供小图片给TreeView控件,DatagridView通常显 ...
- asp TreeView控件的使用
相对于之前发过一个TreeView控件的使用方法 本次利用js操作,页面无刷新,性能提高 Css编码可能时我的模板页样式被继承下来,导致页面变乱,不需要的可以去掉 前台 <style> . ...
- C#TreeView控件遍历文件夹下所有子文件夹以及文件
一直对递归的理解不深刻,有时候觉得很简单,可是用起来总会出错.这里需要在TreeView控件里显示一个文件夹下的所有目录以及文件,毫无意外的需要用到递归. 一开始,想到用递归写一个生成每一个节点(Tr ...
随机推荐
- 去除url后缀(.html,.jsp等)的有效方法
有时候,我们想要隐藏真正的路径,或者觉着很酷,举一个知乎网的例子,如https://www.zhihu.com/question/39547745 那么?如何做到呢,其实,可以有一个非常简单而有效的解 ...
- formData实现图片上传
前言 在 上一篇 已经实现了图片预览,那么如何上传图片呢?有两种思路: 1.将图片转化为dataURL(base64),这样就成为了一串字符串,再传到服务端.不过这样缺点很多,数据量比转换之前增加1/ ...
- docker-compose v3版本命令详解参考
参考和指南 这些主题描述了Compose文件格式的第3版.这是最新的版本. Compose and Docker 兼容性矩阵 有几个版本的Compose文件格式 - 1,2,2.x和3.x.下表是快速 ...
- pku 1330 Nearest Common Ancestors LCA离线
pku 1330 Nearest Common Ancestors 题目链接: http://poj.org/problem?id=1330 题目大意: 给定一棵树的边关系,注意是有向边,因为这个WA ...
- tp的秘密
入口文件index.php define('APP_DEBUG',True); 改为false* memory_get_usage 获取本套系统目前内存* tp框架中ThinkPHP\Library\ ...
- 利用纯CSS美化checkbox和radio和滑动按钮的实现
W3C提供的CheckBox和radio的原始样式非常的丑,而且在不同的额浏览器表现还不一样,使用常规的方法添加样式没法进行修改样式 一, 单选按钮 <html> <head> ...
- 室内地图1:从CAD到Map(画图,发布,路径导航)
首先这个教程整理,比较偏细节. 因为我本身不是做GIS,所以可能有点流水账,当然错漏难免,恳请指正. 当我们做定位的时候,想要可视化展示,室外当然可以直接使用google,百度的底图.对于室内,有两种 ...
- spring boot与jdbcTemplate的整合案例2
简单入门了spring boot后,接下来写写跟数据库打交道的案例.博文采用spring的jdbcTemplate工具类与数据库打交道. 下面是搭建的springbootJDBC的项目的总体架构图: ...
- 使用oracle DB_LINK的一个注意点
今天使用db_link的时候遇到了个有趣的问题,和大家分享一下; 环境:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bi ...
- gcc/g++ 命令的经常使用选项
gcc/g++ 命令的经常使用选项格式(选项 解释) -o FILE 指定输出文件名称.在编译为目标代码时,这一选项不是必须的.假设FILE没有指定,缺省文件名称是a.out. -c 仅仅编译生成目标 ...