ツリービューがあり、ノードをクリックして選択を解除できるようにしたいと思います。
ツリービュークラスを拡張していますが(他の機能も必要です)、小さな問題が発生しました。
これが私が使っているコードです:
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;
}
}
キャンセルに休憩を入れると...それはただループし、ループし、ループします。休憩を取ると、プログラムはある程度使いやすくなります(選択してすぐにキャンセルします。これは良いことです)。ただし、実行中にブレークバックを追加すると、すぐに再びブレークします。ノードを選択する必要もありません!うーん...わかりません