4

TreeView ですべての子アイテムをチェック/チェック解除するにはどうすればよいですか? アイテムの1つが選択状態になり、子アイテムのチェック/チェック解除のバグが発生したときにエラーが発生した可能性があります。

VS 2010 Project+Exe へのリンク

YOUTUBEのビデオ

private void Form1_Load(object sender, EventArgs e)
    {
        treeView1.CheckBoxes = true;
        treeView1.BeginUpdate();
        treeView1.Nodes.Add("1111");
        treeView1.Nodes[0].Nodes.Add("2222");
        treeView1.Nodes[0].Nodes.Add("2222");
        treeView1.Nodes[0].Nodes.Add("2222");
        treeView1.Nodes[0].Nodes.Add("2222");
        treeView1.Nodes[0].Nodes[1].Nodes.Add("3333");
        treeView1.Nodes[0].Nodes[1].Nodes[0].Nodes.Add("4444");
        treeView1.Nodes[0].Nodes[1].Nodes[0].Nodes.Add("4444");
        treeView1.Nodes[0].Nodes[1].Nodes[0].Nodes.Add("4444");
        treeView1.EndUpdate();

        treeView1.ExpandAll();
    }

    private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {
        treeView1.BeginUpdate();

        foreach (TreeNode Node in e.Node.Nodes)
        {
            Node.Checked = e.Node.Checked;
        }

        treeView1.EndUpdate();
    }
4

5 に答える 5

5

Form_Load にあるコードを使用して、そのコードを機能させ、コードにこれらの 2 つのメソッドを追加します。

private void Form1_Load(object sender, EventArgs e)
{
    treeView1.CheckBoxes = true;
    treeView1.BeginUpdate();
    treeView1.Nodes.Add("1111");
    treeView1.Nodes[0].Nodes.Add("2222");
    treeView1.Nodes[0].Nodes.Add("2222");
    treeView1.Nodes[0].Nodes.Add("2222");
    treeView1.Nodes[0].Nodes.Add("2222");
    treeView1.Nodes[0].Nodes[1].Nodes.Add("3333");
    treeView1.Nodes[0].Nodes[1].Nodes[0].Nodes.Add("4444");
    treeView1.Nodes[0].Nodes[1].Nodes[0].Nodes.Add("4444");
    treeView1.Nodes[0].Nodes[1].Nodes[0].Nodes.Add("4444");
    treeView1.EndUpdate();
    treeView1.ExpandAll();
}

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
    foreach (TreeNode childNode in e.Node.Nodes)
    {
        childNode.Checked = e.Node.Checked;
    }
}
于 2013-02-05T02:52:34.533 に答える
1

私が考え出した解決策は次のとおりです。

  • 選択を実行するために、Linq を使用しました。

    if (e.Node.Nodes.Count > 0) e.Node.Nodes.Cast<TreeNode>().Where(tnc => tnc.Checked != e.Node.Checked).ForEach(tn => tn.Checked = e.Node.Checked);

  • 次に、イベントの選択を処理するために、TreeView クラスを拡張しまし public class MyTV : TreeView { protected bool TopOfCascade; TreeNode startNode; public Action FinishedCheckEventsDelegate; public Action InitiateCascadeCheckEventsDelegate; public MyTV() : base() { TopOfCascade = false; startNode = null; } protected override void OnBeforeCheck(TreeViewCancelEventArgs e) { base.OnBeforeCheck(e); if (!TopOfCascade && !e.Cancel) { TopOfCascade = true; startNode = e.Node; if (InitiateCascadeCheckEventsDelegate != null) InitiateCascadeCheckEventsDelegate(); } } protected override void OnAfterCheck(TreeViewEventArgs e) { base.OnAfterCheck(e); if (startNode == e.Node && e.Action != TreeViewAction.Unknown) { if (FinishedCheckEventsDelegate != null) FinishedCheckEventsDelegate(); TopOfCascade = false; startNode = null; } } た。ホスト コントロールでは、カスケードの前後のイベントをフックし、すべてのチェック済み/未チェックのツリー ノードを反復処理して、多くのクロス イベントの発生を回避できます。コンテナを介してカスケードを制御します。

Web からの次の実装から ForEach から IEnumerable を取得しました。

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
  if (source == null) throw new ArgumentNullException("source");
  if (action == null) throw new ArgumentNullException("action");
  foreach (T item in source)
  {
    action(item);
  }
}

幸運を!

于 2014-04-14T16:24:51.647 に答える
0

これが答えです(Hans Passantから):

Winformsツリービュー、子ノードの問題を再帰的にチェック

見つけやすくするためにコメントではなく、回答として書いています。

于 2013-09-25T20:42:02.900 に答える
0
    private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {

        if (e.Action != TreeViewAction.Unknown)
        {
            if (e.Node.Nodes.Count > 0)
            {
                /* Calls the CheckAllChildNodes method, passing in the current 
                Checked value of the TreeNode whose checked state changed. */
                this.CheckAllChildNodes(e.Node, e.Node.Checked);
            }

        }
    }

   private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
    {
        foreach (TreeNode node in treeNode.Nodes)
        {
            node.Checked = nodeChecked;
            if (node.Nodes.Count > 0)
            {
                // If the current node has child nodes, call the CheckAllChildsNodes method recursively. 
                this.CheckAllChildNodes(node, nodeChecked);
            }
        }
    }
于 2013-11-16T15:57:44.930 に答える