3

これは説明が難しいので、私が達成したいこととそれをどのように行っているかを説明するだけなので、誰かが私が間違っていることについて考えているかもしれません。

私のwinFormには、入力するTreeViewコントロールがあります。すべての親には子供がいますが(任意の数)、自分の子供がいる子供はいません。例:

- Parent 1
        Child 1
        Child 2
        Child 3
- Parent 2
       Child 4

私が望む振る舞いは次のとおりです。

  1. ユーザーが子をクリックすると、その子が選択されます(デフォルトで実行されます)
  2. ユーザーが親をクリックすると、親は折りたたまれるか展開されますが、選択内容は変更されません。

ポイント1はTreeViewのデフォルトの動作であるため問題ありませんが、ポイント2は別の話です。

これが私がこれまでにしたことです:

親が選択されないようにするには、BeforeSelectイベントハンドラーを追加して、次のコードを挿入します。

if (e.Node.Parent == null)
    e.Cancel = true;

これは完璧に仕事をします。親の選択をキャンセルしたので、親を展開または折りたたむ必要があります。だから私は上記のコードを次のように変更しました:

if (e.Node.Parent == null)
{
    if (e.Node.IsExpanded)
    {
        e.Node.Collapse();
    }
    else
    {
        e.Node.Expand();
    }
    e.Cancel = true;
}

これは多少機能しますが、+記号をクリックするのとは異なり、Expand()またはCollapse()を呼び出すと、e.Cancel=trueを無視して親ノードが選択されます。ライン。

Collapse()またはExpand()を呼び出す前にSelectedNodeを取得してから元に戻そうとしましたが、これは機能しますが、そうすると、親を再度展開して選択を行います。

どういうわけか、+記号は、親をクリックしたときに発生したいことを正確に実行します-私はそれを機能させることができないようです。

アイデア?

前もって感謝します

4

1 に答える 1

1

これを試して:

    private bool allowExpandCollapse = false;

    private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
    {
        e.Cancel = !allowExpandCollapse;
    }

    private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e)
    {
        e.Cancel = !allowExpandCollapse;
    }

    private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
    {
        if (e.Node.Parent == null)
        {
            e.Cancel = true;
        }
    }

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        if (e.Node.Parent == null)
        {
            allowExpandCollapse = true;
            if (e.Node.IsExpanded)
            {
                TreeNode selectedNode = treeView1.SelectedNode;
                e.Node.Collapse();
                allowExpandCollapse = false;
                treeView1.SelectedNode = selectedNode;
            }
            else
            {
                e.Node.Expand();
                allowExpandCollapse = false;
            }
        }
    }
于 2013-06-03T14:26:27.570 に答える