浅析TreeView控件的操作(下)

上回说到了对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);
            }
        }
    }



 


 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值