现在我用treeview在网页上生成了一个树,并且每个节点都是一个checkbox,问题如下:
1、该如何把数据绑定在每个checkbox上呢?
2、在点击“提交”按钮后如何得到被选中的checkbox值呢?我也用了递归,但是判断不出某个是否被选中(checked),比如
if(node.checked==true)
{
……
}
在执行上面的判断时,即使有选中的,也会跳过去的;我估计是在点按钮之后就重新加载目录树了,所以取不到值,但是不知道该如何解决~~;
以上问题请各路高手帮忙,都被这个问题折磨够戗了~~~~~多谢~

解决方案 »

  1.   

    1. treeview.nodes.text = ...
    2. "即使有选中的,也会跳过去的",怎么个跳法?有选中的也不执行if 后面的语句吗?
      

  2.   

    1. treeview.nodes.text = ...
    --------------------
    文本是可以绑定在节点上的,但是每个checkbox不都应该对应一个值吗?比如<input type="checkbox" name="xx" value="xxx">中的value~,这个值我不太清楚该如何绑定~~2. "即使有选中的,也会跳过去的",怎么个跳法?有选中的也不执行if 后面的语句吗?
    ----------------------
    对,即使我选中了某个checkbox的话,也不执行上面的if语句~~~,
      

  3.   

    1. 绑定的方法我没有用过,我估计是可以,有databinding吧
    2. 如果你在if 处设置一下断点,选中了某个checkbox的话,也不执行上面的if语句?程序跳过if 语句?
      

  4.   

    第一个问题,我已经有点眉目了,就所以用nodedata来绑定;
    第二个还没弄好,我也设断点跟踪了,程序确实不执行啊~~~~~,各位有没有类似的代码让我看看啊~~
      

  5.   

    这是我自己以前做的一段,目的是统计一个字符串
    Private Sub Remote(ByVal Node As Microsoft.Web.UI.WebControls.TreeNode, ByVal ins As String)
            Dim count As Short
            Dim i As Short        count = Node.Nodes.Count
            ins = ins & "-" & Trim(Node.Text.ToString)
            If count = 0 Then
                If Node.Checked = True Then
                    Call Expand(Node, Right(ins, ins.Length - 1))
                End If
            Else
                For i = 0 To count - 1
                    If Node.Checked = True Then
                        Call Expand(Node, Right(ins, ins.Length - 1))
                        Exit For
                    Else
                        Call Remote(Node.Nodes(i), ins)
                    End If
                Next
            End If
        End Sub
      

  6.   

    使用ViewState保存选择的信息,重新加载的时候生成Treeview,然后根据ViewState中选择的信息来确定哪些treenode需要被选中
      

  7.   

    如果把选择的数据保存在viewstate中,是不是该在button_onclick中进行呢?
    但是在onclick事件中,我连哪些checkbox被选中都判断不出来啊?
    用其他办法可以吗?
      

  8.   

    <script  language=\"javascript\" >
    function GetNode()
      {
     var choose;
     var indexid;
     indexid=TreeView1.clickedNodeIndex;
     if (TreeView1.getTreeNode(indexid).getAttribute('Checked'))
      { 
    choose=false;
       }
      else
      { 
     choose=true;
       }
     TreeView1.getTreeNode(indexid).setAttribute('Checked',choose);
     var NodeArray=new Array();
      NodeArray=TreeView1.getTreeNode(indexid).getChildren();
     for(i=0;i<NodeArray.length;i++)
    {
     var tempindex=indexid+"."+i;
     TreeView1.getTreeNode(indexid).setAttribute('Checked',choose);
    }      
      }
    //-->
    </script>
      

  9.   

    遍历TreeView节点(递归算法)
    private void Page_Load(object sender, System.EventArgs e)
    {
    GetAllNodeText(TreeView1.Nodes);
    }
    void GetAllNodeText(TreeNodeCollection tnc)
    {
    foreach(TreeNode node in tnc)
    {
    if(node.Nodes.Count!=0)
    GetAllNodeText(node.Nodes);
    Response.Write(node.Text + " ");
    }
    }
      

  10.   

    有时候,我都真想直接去商场门口发传单,举牌子了
    请一定帮忙,谢谢!
    请看看:
    http://community.csdn.net/Expert/topic/3663/3663763.xml?temp=.569195
      

  11.   

    参考:http://dev.csdn.net/develop/article/29/29028.shtm
      

  12.   

    给你一段代码供参考:
    <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>
      

  13.   

    需要说明一下:需要注意的是如果要初始设置TreeNode为选中状态,只能在客户端设置。如果在服务器端设置TreeNode为选中状态,则在客户端使用getAttribute("Checked"),得到的值永远是true。
      

  14.   

    多谢楼上的各位朋友,我现在就去测试,成功后大家都能得到分的~~HOHO~~~