上回说到了对TreeView的载入,修改,删除,这次要讲的是对treeView的删除以及选中,还有就是对节点的选择
对TreeView的删除依旧是两种方法,
第一种:1、用递归去删除数据库中的数
原理:获取选中的节点的ID值,然后在数据库中删除,然后在数据库库中遍历,找到子节点,删除,回到上一层,找子节点,删除,回到上一层.....
2、对节点的操作
原理,选中的节点,删除下面的子节点集合,然后再删除选中节点;需要特别提醒的是,需要将如果选中的是最顶层节点,就可以像前面说的那样,但是选择的不是最顶层节点,则需要先删除下选中节点的父节点下面的子节点集合中删除,然后再删除选中节点
数据库删除源码:
////// 删除节点 /// /// /// protected void Button1_Click(object sender, EventArgs e) { DeleteNode(Convert.ToInt32(ID.Text.Trim())); } /// 删除所选节点以及子节点 //自定义删除 private void DeleteNode(int nodeId) { string sql = string.Format("select ID from tree where preID={0}", nodeId); DataTable dt = sh.ExecuteQuery(sql, CommandType.Text); for (int i = 0; i < dt.Rows.Count; i++) { DeleteNode(int.Parse(dt.Rows[i][0].ToString())); } string delsql = string.Format("delete from tree where ID={0}", nodeId); sh.ExecuteNonQuery(delsql, CommandType.Text); }
还有一种比较麻烦的是,额,获取选中节点的Id后,进行遍历,然后找到叶子节点也就是最底没有子节点点的节点,然后删除,会倒上一层,找子节点.......
代码:
添加进删除按钮中的语句 Stackdelid = new Stack (); TreeNode selnode = TreeView1.SelectedNode; DeleteNode(selnode.Value.ToString(), ref delid); //组合SQL语句 string sql = "delete [type] where parentid in ("; foreach (string item in delid) { sql += item + ","; } sql = sql.Remove(sql.Length - 1, 1) + ")"; Response.Write(sql); #region 把符合条件的节点ID添加进栈 private void DeleteNode(string fatid, ref Stack delid) { delid.Push(fatid); if (!IsLeaf(fatid)) {//如果不是叶子节点,找子节点 IList sonid = selectIDByParID(fatid); for (int i = 0; i < sonid.Count; i++) { DeleteNode(sonid[i], ref delid); } } } #endregion #region 节点是不是叶子 private bool IsLeaf(string td) { SQLHelp sqlhelp = new SQLHelp(); string sql = "select * from type where parentid = " + td; DataTable dt = sqlhelp.ExecuteQuery(sql, CommandType.Text); if (dt.Rows.Count >= 0) { return false; } else { return true; } } #endregion #region 根据父ID找到所有子ID集合 private IList selectIDByParID(string parid) { System.Collections.Generic.IList id = new System.Collections.Generic.List (); SQLHelp sqlhelp = new SQLHelp(); string sql = "select * from type where parentid = " + parid; DataTable dt = sqlhelp.ExecuteQuery(sql, CommandType.Text); for (int i = 0; i < dt.Rows.Count; i++) { id.Add(dt.Rows[i]["id"].ToString()); } return id; } #endregion
接着就是对节点的选中,这次说的不是点击节点是,取出节点的值,不是,我想说的是设置ShowCheckBox属性后选择然后就是获取选中的节点
原理:我想说的是,遍历节点传进来的节点集合,然后就是子节点,如果选中将其显示的值以及value值以及Text值取出,继续遍历子节点,判断,然后遍历,直到遍历完全部的全部传进来的节点集合
话不多说上代码:
string sb=null ; protected void Button5_Click(object sender, EventArgs e) { FindCheck(TreeView1.Nodes); Response.Write(sb); } private void FindCheck(TreeNodeCollection Nds) { foreach (TreeNode node in Nds) { if (node.Checked) { sb += node.Text + ", "; } if (node.ChildNodes .Count != 0) { FindCheck(node.ChildNodes); } } }
是不是想说一句,我如果要取得一个值呢,我想获取我选中的节点中的第一个,怎么获取?
额·~这个问题嘛,显示的页面上面添加下面这段代码:
上面的这段是用来触发TreeView控件的TreeView1_TreeNodeCheckChange这个事件的,对了还要在页面上添加下面的这句
TreeView1.Attributes.Add("onclick", "postBackByObject()");
上面的这句是用来设置TreeView的属性,用于触发那个事件的;
好啦,准备工作做好了,
额~~如果你要求不高的话,你可以就在TreeView的TreeView1_TreeNodeCheckChange事件中添加下面这句,你就会见到奇效的
protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e) { Response.Write(e.Node.Text ); }我想说的不是这个,我想说的是在那么多的CheckBox中,我只能选择一个,有且只能一个选中,
原理:先说明,那个事件的e值是你最后选中的值,然后就是遍历下面的子节点,如果value的值与e的值相等,就可以选中,其他的就不用选中的
话不多说,上代码:
string Val; protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e) { Response.Write(e.Node.Text ); Val = e.Node.Value; CheckClick(TreeView1.Nodes); } private void CheckClick(TreeNodeCollection preNodes) { foreach (TreeNode tn in preNodes)//遍历传进来的节点的子节点 { if (tn.Value == Val) { tn.Checked = true; } else { tn.Checked = false; } if (tn.ChildNodes.Count > 0) { CheckClick(tn.ChildNodes); } } }