博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析TreeView控件的操作(下)
阅读量:7090 次
发布时间:2019-06-28

本文共 4552 字,大约阅读时间需要 15 分钟。

上回说到了对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后,进行遍历,然后找到叶子节点也就是最底没有子节点点的节点,然后删除,会倒上一层,找子节点.......

代码:

 

添加进删除按钮中的语句    Stack
delid = 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);            }        }    }

 

 

转载于:https://www.cnblogs.com/SharkLock-Chen/archive/2011/11/26/2264108.html

你可能感兴趣的文章
Faster RCNN 爬坑记录
查看>>
初识句柄操作(控制台窗口小实验)
查看>>
Perfect Interview (面试心理)
查看>>
js地址多选实现,居住地,户口,职业,行业多选2
查看>>
嵌套datalist对应分类列表
查看>>
PAT 1019
查看>>
qemu通过命令行直接引导linux内核启动
查看>>
ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛
查看>>
获取上传视频 flv 的视频长度和缩略图
查看>>
文件复制
查看>>
springmvc 跳转页面或者返回json
查看>>
多维数组排序
查看>>
linux vi操作
查看>>
针对discuz系统网站设置301重定向完成全站域名的完美更换操作
查看>>
LVS简介与使用
查看>>
“栈”(stack)
查看>>
JavaScript中的script标签浅析
查看>>
rdb转为rdf
查看>>
[Mugeda HTML5技术教程之19]制作可定制贺卡
查看>>
如何创建自定义ASP.NET MVC5脚手架模板?
查看>>