3

いくつかの親ノードと子ノードを持つツリービューがあります。子ノードが選択されている場合は、親ノードを選択する必要があります。この機能は正常に動作していますが、親ノードに複数の子ノードがあり、複数の子ノードをチェックし、単一の子ノードのチェックを外すと、親ノードのチェックが外れます。

子ノードが選択されている場合、親ノードを選択するためのコードをいくつか実行しました。

private bool updatingTreeView;

private void treSelector_AfterCheck(object sender, TreeViewEventArgs e)
{
    if (updatingTreeView) return;
    updatingTreeView = true;
    SelectParents(e.Node, e.Node.Checked);
    updatingTreeView = false;
}

private void SelectParents(TreeNode node, Boolean isChecked)
{
    if (node.Parent != null)
    {
        node.Parent.Checked = isChecked;
        SelectParents(node.Parent, isChecked);
    }
}

その親の単一の子ノードのいずれかがチェックされている場合、チェックされていない親ノードは必要ありません。

4

5 に答える 5

2

親をチェックする場合は子を選択し、子を設定する場合は親をチェックする完全なルーチンを次に示します。

void tw_AfterCheck(オブジェクト送信者, TreeViewEventArgs e) {

            if (treeView.Enabled) {
                treeView.AfterCheck -= tw_AfterCheck;

                TreeNode node = e.Node;
                if (node.Nodes != null) 
                    node.Nodes.Cast<TreeNode>().ToList().ForEach(v => v.Checked = node.Checked);

                node = e.Node.Parent;
                while (node != null) {
                    bool set = e.Node.Checked
                               ? node.Nodes.Cast<TreeNode>()
                                .Any(v => v.Checked == e.Node.Checked)
                               : node.Nodes.Cast<TreeNode>()
                                .All(v => v.Checked == e.Node.Checked);
                    if (set) {
                        node.Checked = e.Node.Checked;
                        node = node.Parent;
                    }
                    else
                        node = null;
                }
               treeView.AfterCheck += tw_AfterCheck;
            }
        }
于 2014-02-18T14:02:01.650 に答える
1

アイテムのチェックを外すと、aftercheck イベントが発生し、SelectParents を呼び出して、チェックを外すことを伝達します。

チェックされている場合にのみ動作が必要な場合は、e.Node.Checked が true (またはチェックされている) のときに SelectParents を実行するだけです。ただし、以前にチェックされていた唯一の子アイテムのチェックを外した場合、これは親アイテムのチェックを外しません(したがって、子アイテムがチェックされていない状態で親アイテムがチェックされている可能性があります)。

于 2013-08-14T14:56:50.760 に答える
0

各親を検証する場合、その親のすべての子を検証する必要があります。これは、ノードのチェックを外したことが最後かどうかわからないためです。

private void VerifyChecked(TreeNode node)
{
    var current = node;
    while (current != null)
    {
        current.Checked = current.Nodes.Cast<TreeNode>()
            .Any(child => child.Checked);
        current = current.Parent;
    }
}

e.Node.Parent親ではなく、渡されたノードを検証するようにリファクタリングしたことに注意してください。そのため、代わりに渡すように呼び出しを変更する必要があります。

于 2013-08-14T15:02:25.037 に答える