0

TreeView コントロールを使用しています。チェックボックスを使用してデータベースから値をバインドします。

次のような親ノードには、ほぼ 3 つの子が存在します。

Parent1 
  child1
    child2
      child3
Parent2
   child1
     child2
        child3

3つのテーブルからのデータをバインドできますが、すべてうまく機能しています。親ノードが対応するすべての子を自動的にチェックするときに機能が必要です。親 1 をクリックすると、子 123 がチェックされます。child1 をチェックすると、child2 と child3 がチェックされます。子 2 をチェックすると、すべての子 3 項目がチェックされます。どうやってするか?

よろしくお願いします

4

2 に答える 2

2

以下のjavascript関数を使用して、親がチェックされている場合はすべての子ノードをチェックし、少なくとも1つの子ノードがチェックされている場合は親ノードをチェックし、そうでない場合はチェックを外します。

 function OnTreeClick(evt) {
     var src = window.event != window.undefined ? window.event.srcElement : evt.target;
     var isChkBoxClick = (src.tagName.toLowerCase() == "input" && src.type == "checkbox");
     var t = GetParentByTagName("table", src);
     if (isChkBoxClick) {
         var parentTable = GetParentByTagName("table", src);
         var nxtSibling = parentTable.nextSibling;
         if (nxtSibling && nxtSibling.nodeType == 1) {
             if (nxtSibling.tagName.toLowerCase() == "div") {
                 CheckUncheckChildren(parentTable.nextSibling, src.checked);
             }
         }
         CheckUncheckParents(src, src.checked);
     }
 }

 function CheckUncheckChildren(childContainer, check) {
     var childChkBoxes = childContainer.getElementsByTagName("input");
     var childChkBoxCount = childChkBoxes.length;
     for (var i = 0; i < childChkBoxCount; i++) {
         childChkBoxes[i].checked = check;
     }
 }

 function CheckUncheckParents(srcChild, check) {
     var parentDiv = GetParentByTagName("div", srcChild);
     var parentNodeTable = parentDiv.previousSibling;

     if (parentNodeTable) {
         var checkUncheckSwitch;
         var isAllSiblingsChecked = AreAllSiblingsChecked(srcChild);
         if (isAllSiblingsChecked) {
             checkUncheckSwitch = true;
         }
         else {
             checkUncheckSwitch = false;
         }
         var inpElemsInParentTable = parentNodeTable.getElementsByTagName("input");
         if (inpElemsInParentTable.length > 0) {
             var parentNodeChkBox = inpElemsInParentTable[0];
             parentNodeChkBox.checked = checkUncheckSwitch;

             CheckUncheckParents(parentNodeChkBox, checkUncheckSwitch);
         }
     }
 }

 function AreAllSiblingsChecked(chkBox) {
     var parentDiv = GetParentByTagName("div", chkBox);
     var childCount = parentDiv.childNodes.length;
     var k = 0;
     for (var i = 0; i < childCount; i++) {
         if (parentDiv.childNodes[i].nodeType == 1) {
             if (parentDiv.childNodes[i].tagName.toLowerCase() == "table") {
                 var prevChkBox = parentDiv.childNodes[i].getElementsByTagName("input")[0];
                 //if any of sibling nodes are not checked, return false
                 if (prevChkBox.checked) {
                     //add each selected node one value
                     k = k + 1;
                 }
             }
         }
     }

     //Finally check any one of child node is select if selected yes then return ture parent node check

     if (k > 0) {
         return true;
     }
     else {
         return false;
     }
 }
 function GetParentByTagName(parentTagName, childElementObj) {
     var parent = childElementObj.parentNode;
     while (parent.tagName.toLowerCase() != parentTagName.toLowerCase()) {
         parent = parent.parentNode;
     }
     return parent;
 }

このjavascriptを使用して問題を解決しました。

于 2012-08-03T04:50:20.787 に答える
0

単純な再帰関数でそれを行うことができます。

private bool checkTreeNodes(TreeNodeCollection nodes, bool parentChecked)
{
    var isChecked = parentChecked;
    foreach (TreeNode node in nodes)
    {
        if (node.Checked || parentChecked)
        {
            checkTreeNodes(node.Nodes, true);
            node.Checked = true;
            isChecked = true;
        }
        else
        {
            node.Checked = checkTreeNodes(node.Nodes, false);
            isChecked = isChecked || node.Checked;
        }
    }
    return isChecked;
}

次のように使用します。

checkTreeNodes(myTree.Nodes, false);
于 2012-07-23T06:05:41.433 に答える