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()); } } }