C#winform TreeView编程

TreeView右键菜单从数据库中读取,插入,删除,查找(高亮显示并展开),编辑(即地编辑)的例子 
这个项目包括二个文件,分别为From1.cs and FormCommon.cs,一个配置文件App.config 
Form1.cs

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace Tree
{
/// 
/// Form1 的摘要说明。
/// 
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TreeView treeView1;
private System.Data.SqlClient.SqlConnection sqlConnection1;
/// 
/// 必需的设计器变量。
/// 
private System.ComponentModel.Container components = null;
private System.Windows.Forms.ContextMenu contextMenu1;
private System.Windows.Forms.MenuItem menuAdd;
private System.Windows.Forms.MenuItem menuDel;
private System.Windows.Forms.MenuItem menuEdit;
private System.Windows.Forms.MenuItem menuSearch;
private ArrayList list;
private ArrayList listnode;
private string strcomm;
private bool isselected=true;
private System.Windows.Forms.ListBox listBox1;
private TreeNode selectnode ;
 
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
 
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
 
/// 
/// 清理所有正在使用的资源。
/// 
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null
{
components.Dispose();
}
}
base.Dispose( disposing );
}
 
#region Windows 窗体设计器生成的代码
/// 
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// 
private void InitializeComponent()
{
this.treeView1 = new System.Windows.Forms.TreeView();
this.contextMenu1 = new System.Windows.Forms.ContextMenu();
this.menuAdd = new System.Windows.Forms.MenuItem();
this.menuDel = new System.Windows.Forms.MenuItem();
this.menuEdit = new System.Windows.Forms.MenuItem();
this.menuSearch = new System.Windows.Forms.MenuItem();
this.sqlConnection1 = new System.Data.SqlClient.SqlConnection();
this.listBox1 = new System.Windows.Forms.ListBox();
this.SuspendLayout();
// 
// treeView1
// 
this.treeView1.AllowDrop = true;
this.treeView1.ContextMenu = this.contextMenu1;
this.treeView1.HotTracking = true;
this.treeView1.ImageIndex = -1;
this.treeView1.LabelEdit = true;
this.treeView1.Location = new System.Drawing.Point(1616);
this.treeView1.Name = "treeView1";
this.treeView1.SelectedImageIndex = -1;
this.treeView1.Size = new System.Drawing.Size(200388);
this.treeView1.TabIndex = 0;
this.treeView1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeView1_MouseDown);
this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
this.treeView1.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeView1_AfterLabelEdit);
// 
// contextMenu1
// 
this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
 
this.menuAdd,
 
this.menuDel,
 
this.menuEdit,
 
this.menuSearch});
// 
// menuAdd
// 
this.menuAdd.Index = 0;
this.menuAdd.Text = "新增";
this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click);
// 
// menuDel
// 
this.menuDel.Index = 1;
this.menuDel.Text = "删除";
this.menuDel.Click += new System.EventHandler(this.menuDel_Click);
// 
// menuEdit
// 
this.menuEdit.Index = 2;
this.menuEdit.Text = "编辑";
this.menuEdit.Click += new System.EventHandler(this.menuEdit_Click);
// 
// menuSearch
// 
this.menuSearch.Index = 3;
this.menuSearch.Text = "查找";
this.menuSearch.Click += new System.EventHandler(this.menuSearch_Click);
// 
// listBox1
// 
this.listBox1.ItemHeight = 12;
this.listBox1.Location = new System.Drawing.Point(24420);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(288376);
this.listBox1.TabIndex = 1;
// 
// Form1
// 
this.AutoScaleBaseSize = new System.Drawing.Size(614);
this.ClientSize = new System.Drawing.Size(564422);
this.Controls.Add(this.listBox1);
this.Controls.Add(this.treeView1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
 
}
#endregion
 
/// 
/// 应用程序的主入口点。
/// 
[STAThread]
static void Main() 
{
Application.Run(
new Form1());
}
 
private DataSet ds;
private SqlDataAdapter sqlDataAdapter1;
private int maxnodeid;
 
private void Form1_Load(object sender, System.EventArgs e)
{
string strconn=ConfigurationSettings.AppSettings["ConnStr"];
sqlConnection1 
= new SqlConnection(strconn);
this.sqlConnection1.Open();
//填充DataSet
this.CreateDataSet();
//从数据库中读取数据,通过递归生成树。
InitTree(this.treeView1.Nodes,"0");
 
}


private void CreateDataSet()
{
this.sqlDataAdapter1=new SqlDataAdapter("select * from s_menu ",this.sqlConnection1);
this.ds=new DataSet();
this.sqlDataAdapter1.Fill(ds,"tree"); 
}
private void InitTree(TreeNodeCollection Nds,string parentId)
{
DataView dv
=new DataView();
TreeNode tmpNd;
string intId;
dv.Table
=ds.Tables["tree"];
dv.RowFilter
="ParentId='" + parentId + "'" ;
foreach(DataRowView drv in dv)
{
tmpNd
=new TreeNode();
tmpNd.Tag
=drv["NodeId"].ToString();
tmpNd.Text
=drv["NodeName"].ToString();
Nds.Add(tmpNd);
intId
=drv["ParentId"].ToString();
InitTree(tmpNd.Nodes,tmpNd.Tag.ToString());
}

//新增节点操作
private void insert(string type)
{
//判断是新增树节点,还是子节点.
string strinsert="insert into s_menu values('{0}','{1}','{2}')"
string strformat="";
if(type=="sub")
strformat
=string.Format(strinsert,maxnodeid.ToString(),this.selectnode.Tag.ToString(),this.strcomm);
else
strformat
=string.Format(strinsert,maxnodeid.ToString(),"0",this.strcomm); 
SqlCommand cmd
=new SqlCommand(strformat,this.sqlConnection1); 
cmd.ExecuteNonQuery(); 
}
//为新增节点算出最大的节点值,并以此值作为新增的节点ID值
private int GetMaxNodeid()
{
int pre=0,last=0;
DataSet maxds
=new DataSet();
this.sqlDataAdapter1=new SqlDataAdapter("select nodeid from s_menu order by nodeid",this.sqlConnection1);
this.sqlDataAdapter1.Fill(maxds);
for(int i=0;i{
if(i+1{
pre
=int.Parse(maxds.Tables[0].Rows[i][0].ToString());
last
=int.Parse(maxds.Tables[0].Rows[i+1][0].ToString()); 
if(last-pre!=1)
return pre+1;
}
}
return last+1

private void getallnode(TreeNode tn)
{
foreach(TreeNode node in tn.Nodes)
{
list.Add(node.Tag.ToString());
if(node.Nodes.Count>0)
{
getallnode(node);
}
}
}
 
private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
//判断是否点击了某个节点
this.selectnode= this.treeView1.GetNodeAt (e.X ,e.Y );
if(selectnode==null)
this.isselected=false;
else
this.isselected=true;

private void menuAdd_Click(object sender, System.EventArgs e)
{
//判断是否点击了某个节点,若没有点击了,则是新增一个树节点
if(isselected==false)
{
//算出新增树节点的ID值
maxnodeid=GetMaxNodeid();
TreeNode tmpNd
=new TreeNode();
//赋值
tmpNd.Tag=this.maxnodeid.ToString();
FormCommon frmCommon
=new FormCommon();
DialogResult result
= frmCommon.ShowDialog();
if(result==DialogResult.OK)
{
//取到新增树节点的文本值
tmpNd.Text=frmCommon.strcomm;
this.strcomm=frmCommon.strcomm;
//新增树节点
this.treeView1.Nodes.Add(tmpNd);
//插入数据库(说明插入的是树节点)
this.insert("root");
//展开
this.selectnode.Expand();
}
}
else
{
//判断是否点击了某个节点,若点击了,则是新增一个子节点
this.contextAddSub();


private void contextAddSub()
{
//得到新增子节点的ID值
maxnodeid=GetMaxNodeid();
TreeNode tmpNd
=new TreeNode();
//赋值
tmpNd.Tag=this.maxnodeid.ToString(); 
FormCommon frmCommon
=new FormCommon();
DialogResult result
= frmCommon.ShowDialog();
if(result==DialogResult.OK)
{
//取到新增树节点的文本值
tmpNd.Text=frmCommon.strcomm;
this.strcomm=frmCommon.strcomm;
//新增子节点
this.selectnode.Nodes.Add(tmpNd);
//插入数据库(说明插入的是子节点)
this.insert("sub");
//展开
this.treeView1.SelectedNode.Expand(); 

}
//删除节点操作
private void menuDel_Click(object sender, System.EventArgs e)
{
//新建一个ArrayList,用于保存要删除的节点下边的所有子节点
list=new ArrayList();
if(this.isselected==true)
{
//得到删除的节点下边的所有子节点
getallnode(this.selectnode);
//把要删除的节点也加进去
list.Add(this.selectnode.Tag.ToString());
//循环从数据库中删除
for(int i=0;i{
string strdel="delete s_menu where nodeid='{0}'"
string strformat=""
strformat
=string.Format(strdel,list[i]); 
SqlCommand cmd
=new SqlCommand(strformat,this.sqlConnection1); 
cmd.ExecuteNonQuery();
}
//从树中删除
this.selectnode.Remove();

}
//修改节点的值
private void menuEdit_Click(object sender, System.EventArgs e)
{
if(this.isselected==true)
{
FormCommon frmCommon
=new FormCommon();
DialogResult result
= frmCommon.ShowDialog();
if(result==DialogResult.OK)
{
string strdel="update s_menu set nodename= '{1}' where nodeid='{0}'"
string strformat=""
strformat
=string.Format(strdel,this.selectnode.Tag.ToString(),frmCommon.strcomm); 
SqlCommand cmd
=new SqlCommand(strformat,this.sqlConnection1); 
cmd.ExecuteNonQuery();
this.selectnode.Text=frmCommon.strcomm; 
}

}
//遍历所有节点.查找值
private void getvaluenode(TreeNodeCollection tn,string value)
{
foreach(TreeNode node in tn)

if(node.Nodes.Count>0)
{
getvaluenode(node.Nodes,value);
}
if(node.Text==value)
 listnode.Add(node);
}

private void menuSearch_Click(object sender, System.EventArgs e)
{
int j,k;
this.listnode=new ArrayList();
FormCommon frmCommon
=new FormCommon();
DialogResult result
= frmCommon.ShowDialog();
if(result==DialogResult.OK)
{
TreeNode n 
=new TreeNode();
TreeNode temp
=new TreeNode();
//下面的函数是填充listnode;
getvaluenode(this.treeView1.Nodes,frmCommon.strcomm);
for(int i=0;i{
j
=0;k=0;
n
=(TreeNode)listnode[i];
if (n != null)
{
temp
=n;
//得到上面结点的数量,并将数量保存到变量j;
for(;n.Parent!=null;)
{
n
=n.Parent;
j
++;
}
//恢复原值 
n=temp;
//新建一个树结点数组做保存得到查询到的所有节点.
TreeNode[] m=new TreeNode[j];
for(;n.Parent!=null;)
{
n
=n.Parent;
m[k]
=n;
k
++
}
for(int p=0;pm[p].Expand();
n
=temp;
n.ForeColor
=Color.Red;
}
}

}
private void treeView1_AfterLabelEdit(object sender, System.Windows.Forms.NodeLabelEditEventArgs e)
{
if(this.treeView1.SelectedNode.Text!=null)
{
string strdel="update s_menu set nodename= '{1}' where nodeid='{0}'";
 
string strformat="";strformat=string.Format(strdel,this.treeView1.SelectedNode.Tag.ToString(),e.Label.ToString());SqlCommand cmd=new SqlCommand(strformat,this.sqlConnection1); 
cmd.ExecuteNonQuery();
 
}

private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
this.listBox1.Items.Clear();
this.listBox1.Items.Add(this.treeView1.SelectedNode.FullPath.ToString());
}
}
}

 



//formCommon.cs 
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms; 
namespace Tree
{
/// 
/// FormCommon 的摘要说明。
/// 
public class FormCommon : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox txtCommon;
private System.Windows.Forms.Button btnOK;
/// 
/// 必需的设计器变量。
/// 
private System.ComponentModel.Container components = null;
public string strcomm;
public FormCommon()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
 
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//

/// 
/// 清理所有正在使用的资源。
/// 
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );

#region Windows 窗体设计器生成的代码
/// 
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// 
private void InitializeComponent()
{
this.txtCommon = new System.Windows.Forms.TextBox();
this.btnOK = new System.Windows.Forms.Button();
this.SuspendLayout();
// 
// txtCommon
// 
this.txtCommon.Location = new System.Drawing.Point(3616);
this.txtCommon.Name = "txtCommon";
this.txtCommon.TabIndex = 0;
this.txtCommon.Text = "";
// 
// btnOK
// 
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(4852);
this.btnOK.Name = "btnOK";
this.btnOK.TabIndex = 1;
this.btnOK.Text = "确定";
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
// 
// FormCommon
// 
this.AutoScaleBaseSize = new System.Drawing.Size(614);
this.ClientSize = new System.Drawing.Size(17698);
this.Controls.Add(this.btnOK);
this.Controls.Add(this.txtCommon);
this.Name = "FormCommon";
this.Text = "FormCommon";
this.ResumeLayout(false);
 
}
#endregion
 
private void btnOK_Click(object sender, System.EventArgs e)
{
if(this.txtCommon.Text=="")
{
MessageBox.Show(
"不能为空");
this.DialogResult=DialogResult.None;
}
else
this.strcomm=this.txtCommon.Text; 
}
}
}

 

 

//配置文件App.Config
//数据库脚本 
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[S_Menu]') and OBJECTPROPERTY(id, N'IsUserTable'= 1)
drop table [dbo].[S_Menu]
GO
 
CREATE TABLE [dbo].[S_Menu] (
[NodeId] [
char] (6) COLLATE Chinese_PRC_CI_AS NULL ,
[ParentId] [
char] (6) COLLATE Chinese_PRC_CI_AS NULL ,
[NodeName] [nvarchar] (
50) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]
GO______________________________ 

Nodeid parentid nodename 
10000 0 湖北省 
10001 10000 武汉市
10002 10000 宜昌市
10003 0 广东省
posted @ 2007-07-31 10:55  Campagnia Te  Views(6756)  Comments(3Edit  收藏  举报
By Campagnia Te