上回说到了对TreeView的载入,修改,删除,这次要讲的是对treeView的删除以及选中,还有就是对节点的选择
对TreeView的删除依旧是两种方法,
第一种:1、用递归去删除数据库中的数
原理:获取选中的节点的ID值,然后在数据库中删除,然后在数据库库中遍历,找到子节点,删除,回到上一层,找子节点,删除,回到上一层.....
2、对节点的操作
原理,选中的节点,删除下面的子节点集合,然后再删除选中节点;需要特别提醒的是,需要将如果选中的是最顶层节点,就可以像前面说的那样,但是选择的不是最顶层节点,则需要先删除下选中节点的父节点下面的子节点集合中删除,然后再删除选中节点
数据库删除源码:
/// <summary>
/// 删除节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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后,进行遍历,然后找到叶子节点也就是最底没有子节点点的节点,然后删除,会倒上一层,找子节点.......
代码:
////添加进删除按钮中的语句
////Stack<string> delid = new Stack<string>();
////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<string> delid)
{
delid.Push(fatid);
if (!IsLeaf(fatid))
{//如果不是叶子节点,找子节点
IList<string> 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<string> selectIDByParID(string parid)
{
System.Collections.Generic.IList<string> id = new System.Collections.Generic.List<string>();
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);
}
}
}
是不是想说一句,我如果要取得一个值呢,我想获取我选中的节点中的第一个,怎么获取?
额·~这个问题嘛,显示的页面上面添加下面这段代码:
<script type="text/javascript" >
function postBackByObject()
{
var o = window.event.srcElement;
if (o.tagName == "INPUT" && o.type == "checkbox")
{
__doPostBack("","");
}
}
</script>
上面的这段是用来触发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);
}
}
}