3

WindowsフォームTreeViewコントロールを使用しています。

私がそれを接続する方法は次のとおりです(簡略化):

TreeView treeView = new TreeView();

treeView.BeforeSelect += beforeSelect;

private void beforeSelect(sender, args)
{
     MessageBox.Show("Some msg");

     // more code
}

特定のシナリオでは、MessageBox.Showの呼び出しにより、BeforeSelectイベントの別の発生がトリガーされ、別のイベントがトリガーされます。

このイベントは、ツリービューでアイテムごとに発生しているようです(発生した回数をカウントしました)。

これが発生する理由については、インターネット全体で詳細を検索しました。

私が見つけた1つのことは、TreeViewがフォーカスを取得したときに最初のノードを自動的に選択することでした。ただし、これは、イベントがツリー内のツリーノードアイテムの数として発生する理由を説明していません。

これについて何か助けていただければ幸いです。これについては、Microsoft Connectのバグを発生させることを検討しています。これは、コントロールが機能するはずだと思う方法と一致しない非常に奇妙な動作のように見えるためです。

4

3 に答える 3

3

次のように自分をブロックするだけで十分でしょうか?

private bool _inside;

private void beforeSelect( object sender, EventArgs args )
{
    if ( !_inside )
    {
        _inside = true;

        MessageBox.Show("Some msg");

        // more code

        _inside = false;
    }
}

これにより、関数の「再帰的」呼び出しが許可されなくなります。

于 2012-08-23T07:44:46.603 に答える
3

デフォルトでは、BeforeSelectイベントは複数回発生しません。

ノードを選択すると、選択イベントまたはタスクを中断するダイアログ(ここではメッセージボックス)が表示されますが、ダイアログを閉じると、中断に基づいて選択イベントが再度発生します。ツリービューのAfterSelectイベントを使用して処理を行う必要があります...そしてBeforeSelectは検証のためにのみ使用してください。

このコードを見てください-実行してください

void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
    e.Node.Tag = (int)(e.Node.Tag ?? 0) + 1;
    int count = (int)(e.Node.Tag); 
    e.Node.Text = String.Format("selected {0} Count: {1}", e.Action.ToString(), count);
 }
于 2012-08-23T07:51:47.867 に答える
-2

オブジェクトを定義するときは、次のように書く必要があります。

真の書き込み:

private static TreeView projectagac; 
...
...
...
projectagac = new TreeView();

したがって、作成するオブジェクトは1つだけです。

于 2014-04-26T09:16:48.513 に答える