在asp.net,TreeView中怎样实现根节点点击右键添加子节点?急用,谢谢

解决方案 »

  1.   

    http://zhidao.baidu.com/question/80077330.html
      

  2.   

    http://blog.163.com/polatudream@126/blog/static/1565770320081311535305/
      

  3.   

    http://topic.csdn.net/u/20080403/18/12FBAFBC-2AF0-4FA3-AEAE-A15F862DA14E.html
      

  4.   

    那不是有menu吗,点击添加节点
      

  5.   

    TreeView右键菜单从数据库中读取,插入,删除,查找(高亮显示并展开),编辑(即地编辑)的例子这个项目包括二个文件,分别为From1.cs and FormCommon.cs,一个配置文件App.configForm1.csusing 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();//填充DataSetthis.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);elsestrformat=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;elsethis.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();}
      

  6.   

    //从树中删除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.csusing 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);}#endregionprivate void btnOK_Click(object sender, System.EventArgs e){if(this.txtCommon.Text==""){MessageBox.Show("不能为空");this.DialogResult=DialogResult.None;}elsethis.strcomm=this.txtCommon.Text;}}}//配置文件App.Config//数据库脚本if exists (select * from dbo.sysobjects where [dbo].[S_Menu]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table [dbo].[S_Menu]GOCREATE 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 nodename10000 0 湖北省10001 10000 武汉市10002 10000 宜昌市10003 0 广东省