请问 
怎么实现像是vs安装时选择功能的那种树
就是在树的前面有复选按钮的 而且可以点击全选子目录的那种
谢谢了

解决方案 »

  1.   

    下载webcontrol
    http://www.asp.net/IEWebControls/Download.aspx?tabindex=0&tabid=1
    里面有TreeView控件可以加复选框
      

  2.   

    Private Sub BuildTree()
            BbsAll.Nodes.Add("请选择要发帖的版块")
            BbsAll.SelectedNode = BbsAll.Nodes(0)
            Dim dv As DataView = mBroads.DefaultView()
            dv.Sort = "类别"
            For i As Integer = 0 To dv.Count - 1
                If dv(i).Item(3) <> BbsAll.SelectedNode.Text Then                Dim treenode As New TreeNode(dv(i).Item(3))
                    treenode.Tag = dv(i).Item(1)                BbsAll.Nodes(0).Nodes.Add(treenode)
                    BbsAll.SelectedNode = treenode
                    Dim streenode As New TreeNode(dv(i).Item(4))
                    streenode.Tag = dv(i).Item(1)                BbsAll.SelectedNode.Nodes.Add(streenode)            Else
                    Dim treenode As New TreeNode(dv(i).Item(4))
                    treenode.Tag = dv(i).Item(1)                BbsAll.SelectedNode.Nodes.Add(treenode)            End If        Next        BbsAll.SelectedNode = BbsAll.Nodes(0)
        End Sub    Private Sub BbsAll_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles BbsAll.AfterCheck
            If e.Action <> TreeViewAction.Unknown Then
                If e.Node.Nodes.Count > 0 Then
                    ' Calls the CheckAllChildNodes method, passing in the current 
                    ' Checked value of the TreeNode whose checked state changed. 
                    Me.CheckAllChildNodes(e.Node, e.Node.Checked)
                End If
            End If    End Sub    Private Sub CheckAllChildNodes(ByVal treeNode As TreeNode, ByVal nodeChecked As Boolean)
            Dim node As TreeNode
            For Each node In treeNode.Nodes
                node.Checked = nodeChecked
                If node.Nodes.Count > 0 Then
                    ' If the current node has child nodes, call the CheckAllChildsNodes method recursively.
                    Me.CheckAllChildNodes(node, nodeChecked)
                End If
            Next node
        End Sub
    #End Region
      

  3.   

    TreeView控件一般,用的过程中会不断发现问题.
    另外有一个叫什么阿赖的什么树,你网上搜一下.那是js
      

  4.   

    treeview的就很强,也很简单,去微软的网站下一个就行
      

  5.   

    下载webcontrol
    我用的就是这个实现你要的功能
      

  6.   

    idwebcontrols官方下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyID=FAC6350C-8AD6-4BCA-8860-8A6AE3F64448&displaylang=en安装后,在工具箱里面加入 TreeView 控件,并在后台引入名称空间:using Microsoft.Web.UI.WebControls;
      

  7.   

    通过递归条用实现树的初始化:
    以下代码工参考:
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Configuration;
    using Microsoft.Web.UI.WebControls;namespace NCMT
    {
    /// <summary>
    /// SelectFunc 的摘要说明。
    /// </summary>
    public class SelectFunc : System.Web.UI.Page
    {
    protected Microsoft.Web.UI.WebControls.TreeView tvwFunc;
    protected System.Web.UI.WebControls.Panel panItem;

    protected string sSql = null;
    protected SqlConnection conn;
    protected SqlDataAdapter apt;
    protected DataSet ds;
    //private static string strTypeID = ""; private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    if(!Page.IsPostBack)
    {

    string sConn = ConfigurationSettings.AppSettings["NCMT"];
    conn = new SqlConnection(sConn);

    CreateDataSet();
    InitFuncTree(tvwFunc.Nodes,"0");

    //注册客户端 oncheck 事件
    tvwFunc.Attributes.Add("oncheck","tree_oncheck(document.getElementById('tvwFunc'))");
        
    }
    } //创建数据集
    private DataSet CreateDataSet()
    {
    //sSql = "Select * From T_Navigation Where F_OutOrIn = 'InNavi' Order By ID,F_NodeName";
    sSql = "Select * From T_Function Order By ID,F_NodeName";
    apt = new SqlDataAdapter(sSql,conn);
    ds = new DataSet();
    apt.Fill(ds,"dtFunc");
    return ds;
    }

    //初始化科目树,并通过递归调用显示子树
    private void InitFuncTree(TreeNodeCollection tncCurrent,string sParentID)
    {
    DataView dvwFunc = new DataView();
    TreeNode nodTemp;
    dvwFunc.Table = ds.Tables["dtFunc"];
    dvwFunc.RowFilter = "F_ParentID = '" + sParentID + "'";
    foreach(DataRowView drvFunc in dvwFunc)
    {
    nodTemp = new TreeNode();
    nodTemp.CheckBox = true;
    nodTemp.ID = drvFunc["F_NodeID"].ToString();
    nodTemp.Text = drvFunc["F_NodeName"].ToString();
    nodTemp.NodeData = drvFunc["F_NodeID"].ToString(); tncCurrent.Add(nodTemp);
    //递归调用显示子树
    InitFuncTree(nodTemp.Nodes,nodTemp.ID);
    }
    }
    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.tvwFunc.Check += new Microsoft.Web.UI.WebControls.ClickEventHandler(this.tvwFunc_Check);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void tvwFunc_Check(object sender, Microsoft.Web.UI.WebControls.TreeViewClickEventArgs e)
    {
    tvwFunc.GetNodeFromIndex(tvwFunc.SelectedNodeIndex).Checked = true;
    }
    }
    }
      

  8.   

    在客户端来实现你的 CheckBox 的选择功能:<script language="javascript">
    <!--
    var strFuncs = ""; //功能节点ID字符串
    var strSepa = ","; //功能节点ID字符串的分隔符

    //单击"取消"按钮
    function btnCancel_Click()
    {
    self.close();
    }

    //单击"确定"按钮,得到所选择的所有功能选项
    function btnOK_Click()
    {
    var tvwFunc1 = document.getElementById("tvwFunc");

    var strFunc = "";
    var allRootNodes = new Array();
    allRootNodes = tvwFunc1.getChildren();

    strFunc = getCheckedNodeID(allRootNodes);
    window.parent.returnValue = strFunc; //向父页面返回功能节点ID
    self.close();
    }

    //遍历所有节点,获取所有选中节点的 ID 号
    function getCheckedNodeID(NodeArray)
    {
    if(parseInt(NodeArray.length) == 0)
    {
    return;
    }
    else
    {
    for(var i = 0; i < NodeArray.length; i++)
    {
    var cNode;
    cNode = NodeArray[i];
    if(cNode.getAttribute("Checked") == true)
    {
    strFuncs = strFuncs + cNode.getAttribute("ID") + strSepa;
    }

    if(cNode.getChildren().length != 0)
    {
    //第归调用
    getCheckedNodeID(cNode.getChildren());
    }
    }
    }

    var iPos = strFuncs.lastIndexOf(",");

    if(iPos != 0)
    {
    return strFuncs.substring(0,iPos);
    }
    else
    {
    return strFuncs;
    }
    }

    //初始化选中节点
    function initCheckedNode()
    {
    var trids = window.dialogArguments;
    var arrCheckedId = new Array();
    var arrUncheckedId = new Array();
    if(trids != null)
    {
    arrCheckedId = trids.split(",");
    var tvwFunc = document.getElementById("tvwFunc");
    var arrAllRootNode = new Array();
    arrAllRootNode = tvwFunc.getChildren();

    try
    {
    for(var i = 0; i < arrCheckedId.length; i++)
    {
    FindOriFuncNode(arrAllRootNode,arrCheckedId[i]);
    }
    }
    catch(e)
    {
    alert(e);
    }

    }
    }


    //第归调用遍历所有树形节点
    function FindOriFuncNode(NodeArray,nodeID)
    {
    if(parseInt(NodeArray.length) == 0)
    {
    return;
    }
    else
    {
    for(var i = 0; i < NodeArray.length; i++)
    {
    var cNode = NodeArray[i];
    if(cNode.getAttribute("ID") == nodeID)
    {
    cNode.setAttribute("Checked","true");
    break;
    }

    if(parseInt(cNode.getChildren().length) != 0)
    {
    FindOriFuncNode(cNode.getChildren(),nodeID);
    }
    }
    }
    }

    //oncheck事件
    function tree_oncheck(tree)
    {
    var node = tree.getTreeNode(tree.clickedNodeIndex);
    var blChecked = node.getAttribute("Checked");

    //设置子节点选中
    setCheck(node,blChecked);

    //设置父节点选中
    setParentNode(node);

    document.all.checkedNodes.value = "";
    document.all.uncheckedNodes.value = "";

    FindCheckedFromNode(document.getElementById("tvwFunc"));
    }

    //设置子节点状态
    function setCheck(node,blChecked)
    {
    var childNodes = new Array();
    childNodes = node.getChildren();

    if(parseInt(childNodes.length) == 0)
    {
    return;
    }
    else
    {
    for(var i = 0; i < childNodes.length; i++)
    {
    var cNode = childNodes[i];
    if(parseInt(cNode.getChildren().length) != 0)
    {
    //递归调用
    setCheck(cNode,blChecked);
    }
    cNode.setAttribute("Checked",blChecked);
    }
    }
    }

    //设置父节点状态,
    function setParentNode(node)
    {
    if(node.getAttribute("Checked"))
    {
    //如果节点选中,则设置所有父节点选中
    var parentNode = node.getParent();
    while(parentNode != null)
    {
    parentNode.setAttribute("Checked","true");
    parentNode = parentNode.getParent();
    }
    }
    else
    {
        var blChecked = false;
    var parentNode = node.getParent();
    if(parentNode != null)
    {
    var arrBrotherNode = parentNode.getChildren();
    for(var i = 0; i < arrBrotherNode.length; i++)
    {
    var bNode = arrBrotherNode[i];
    if(bNode.getAttribute("Checked"))
    {
    blChecked = true;
    break;
    }
    }

    // 如果所有子节点CheckBox为假,则设置父节点为假
    if(blChecked == false)
    {
    parentNode.setAttribute("Checked","false");
    }
    }
    }
    }



    //获取所有节点状态
    function FindCheckedFromNode(tree)
    {
    var allNodes = new Array();
    allNodes = tree.getChildren();

    for(var i = 0; i < allNodes.length; i++)
    {
    var cNode;
    cNode = allNodes[i];
    if(cNode.getAttribute("Checked"))
    {
    addCheckedNode(cNode);
    }
    else
    {
    addUncheckedNode(cNode);
    }

    if(cNode.getChildren().length != 0)
    {
    //递归调用
    FindCheckedFromNode(cNode);
    }
    }
    }

    //添加选中节点
    function addCheckedNode(node)
    {
    document.all.checkedNodes.value += node.getAttribute("NodeData");
    document.all.checkedNodes.value += ',';
    }


    //添加未选中节点
    function addUncheckedNode(node)
    {
    document.all.uncheckedNodes.value += node.getAttribute("NodeData");
    document.all.uncheckedNodes.value += ',';
    }
    //-->
    </script>
      

  9.   

    http://community.csdn.net/Expert/topic/3169/3169028.xml?temp=.8414118
      

  10.   

    要是 morality(业精于勤,行成于思!) 把前台代码也贴出来的话就完美了!呵呵!个人意见,仅供参考,偶也是菜鸟一只!