欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅析TreeView控件的操作(下)

程序员文章站 2022-06-08 10:20:42
...

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