0

ツリービューがあり、ノードをクリックして選択を解除できるようにしたいと思います。

ツリービュークラスを拡張していますが(他の機能も必要です)、小さな問題が発生しました。

これが私が使っているコードです:

     protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
    {

        base.OnNodeMouseClick(e);
        if (this.SelectedNode == e.Node)
        {
            this.SelectedNode = null;
            selectedSame = true;
        }
    }


    protected override void OnBeforeSelect(TreeViewCancelEventArgs e)
    {
        if (selectedSame)
        {
            selectedSame = false;
            base.OnBeforeSelect(e);
            e.Cancel = true;
        }
    }

e.cancelが呼び出された後、OnBeforeSelectをループバックしますが、これはfalseであるため、選択します(今行ったことを元に戻します)。

私はselectedSame=falseを取りました。OnBeforeSelectから出て、他の場所の状態にしますが、このピースは無限に実行され、壊れることはありません!

    if (selectedSame)
        {
            selectedSame = false;
            base.OnBeforeSelect(e);
            e.Cancel = true;
        }

また、次のコマンドでテストしました。

    protected override void OnBeforeSelect(TreeViewCancelEventArgs e)
    {

            base.OnBeforeSelect(e);
            e.Cancel = true;
    }

また、ループは無数になります(ブレークを解除すると実際に終了しますが、元に戻してクリックすると、何百回もループします)。

e.Cancelがどのように機能するのか、私にはよくわかりません。キャンセルを押すとすぐに、通話を終了せずにすぐに戻ってしまうようです。

アドバイスをいただければ幸いです:)

-ライト

編集:-詳細情報

私が夢中になったイベントがこの問題を引き起こしていないことを確認するために、まったく新しいプロジェクトを作成しました。同じ結果ですが、少なくともそれが取っているステップを発見することになりました。「this.SelectedNode=null」を設定すると、OnBeforeSelectがトリガーされ、最初にすべてが台無しになります。しかし、クリックするとツリーの選択されたノードをnullに設定するボタンがある場合、OnBeforeSelectは発生しません。では、違いは何ですか?

最後の:

これ以外の拡張クラスのコードはありません:

    class StatedTreeView : System.Windows.Forms.TreeView
    {
    protected override void OnBeforeSelect(TreeViewCancelEventArgs e)
            {
            e.Cancel = true;            
            }
    }

キャンセルに休憩を入れると...それはただループし、ループし、ループします。休憩を取ると、プログラムはある程度使いやすくなります(選択してすぐにキャンセルします。これは良いことです)。ただし、実行中にブレークバックを追加すると、すぐに再びブレークします。ノードを選択する必要もありません!うーん...わかりません

4

2 に答える 2

1

これは、デバッガーによって引き起こされるアーティファクトです。デバッガーは、可能な限りプログラムの邪魔にならないようにします。ただし、ブレークポイントでブレークすることによる避けられない副作用がいくつかあります。これにより、UIイベントのデバッグが困難になる傾向があります。たとえば、Paintイベントハンドラは扱いにくい傾向があります。

ここでの問題は、プログラムからVisualStudioにフォーカスが変わることです。そして、TreeView.HideSelectionプロパティがTrueに設定されています。したがって、フォーカスの変更により、実際には現在のツリーノードの選択が解除されます。実行を再開すると、フォーカスはTreeViewに戻り、ノードが再度選択されます。これにより、OnBeforeSelect()メソッドが再度トリガーされます。これにより、ブレークポイントが再度トリガーされます。etcetera、etcetera。

極端な場合、これらの副作用を乗り越えるためにリモートデバッガーを使用する必要があるかもしれません。しかし、それほど遠くまで行く必要はありません。コードが優れていることを確認してください。HideSelectionをfalseに設定すると、これをデバッグし続ける必要がある場合に備えて修正されます。

于 2013-01-17T22:47:58.463 に答える
0

あなたは何度も何度もOnBeforeSelectイベントを呼び出し続けるので?停止条件なしでイベントを再帰的に呼び出しています(イベントe.Cancel = true;の呼び出しなので)。

電話する必要がありますbase.OnBeforeSelectか?もしそうなら、あなたは前に電話したいかもしれませんe.Cancel = true;

于 2013-01-17T19:26:08.937 に答える