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 }