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( 16 16 );
this .treeView1.Name  =   " treeView1 " ;
this .treeView1.SelectedImageIndex  =   - 1 ;
this .treeView1.Size  =   new  System.Drawing.Size( 200 388 );
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( 244 20 );
this .listBox1.Name  =   " listBox1 " ;
this .listBox1.Size  =   new  System.Drawing.Size( 288 376 );
this .listBox1.TabIndex  =   1 ;
//  
//  Form1
//  
this .AutoScaleBaseSize  =   new  System.Drawing.Size( 6 14 );
this .ClientSize  =   new  System.Drawing.Size( 564 422 );
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( 36 16 );
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( 48 52 );
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( 6 14 );
this .ClientSize  =   new  System.Drawing.Size( 176 98 );
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 广东省

转载于:https://www.cnblogs.com/CampagniaTe/archive/2007/07/31/837309.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值