4

TreeNode の .Collapse() メソッドまたは TreeView の .CollapseAll() メソッドの呼び出し以外に、TreeView が折りたたまれる原因は何ですか?

私が開発しているアプリケーションでは、TreeView は正しく動作しません。TreeView は 2 つのレベルのみを維持します。親ノードの子を選択すると、他のすべてのノードがすぐに折りたたまれます。ただし、私のコードには .Collapse() または .CollapseAll() メソッド呼び出しはまったくありません!

TreeView のすべてのプロパティは、true に設定されている .LabelEdit プロパティを除き、デフォルトのままです。TreeView には、単純な検証/メッセージ ボックス ルーチン用の AfterLabelEdit イベント内に関連付けられたコードがいくつかあります。

私が試してみました:

  • TreeView の BeforeCollapse イベントをフックし、e.CancelAction フラグを立てます。

  • TreeView の AfterSelect イベント内のすべてのノードを手動で展開します。
    (これは実験としては問題なく動作しますが、ノードの折りたたみを完全に禁止するつもりはありません!)

コード内の多くのポイントで、ノードごとに TreeView を反復処理してプロパティを確認しています。ただし、ノードの追加または削除は行われません。ユーザーが選択を行ったときに変更される唯一の TreeNode プロパティは、.ImageIndex と .SelectedImageIndex です。

上記の 2 つの解決策以外に、このエラーの原因についての手がかりがありません。解決策が実現できない場合でも、崩壊を閉じ込めるための適切な方法についてアイデアを持っている人はいますか? (BeforeCollapse イベント内にブレークポイントを設定しようとしましたが、ユーザーがマウスまたはキーボードを介してノードを明示的に折りたたまない限り、トリガーされません。)


アップデート:

この問題は、TreeNode の .SelectedImageIndex プロパティを変更したことが原因です。このプロパティを変更すると、他のすべてのノードが折りたたまれます。

.SelectedImageIndex プロパティ変更コードを .BeginUpdate() および .EndUpdate() 呼び出しで囲みましたが、役に立ちませんでした。

どうすればこれを回避できますか?

4

1 に答える 1

10

これは、ネイティブ ウィンドウが Windows で動作する方法の副作用です。ウィンドウ オプションの多くは、CreateWindowEx() 呼び出しのスタイル フラグによって指定されます。フォーム上で境界線がどのように見えるかなどの基本的なもの。ListView が持つべきビューの種類。TreeView にチェックボックスを表示するかどうか。

これらのスタイルは、コントロールのプロパティとして公開されます。しかし、問題があります。このようなプロパティを変更するには、CreateWindowEx() 呼び出しで新しいスタイル フラグを指定できるように、ウィンドウを最初から再作成する必要があります。これには副作用があり、ウィンドウが完全に再作成されるため、以前の状態がすべて失われます。

Windows フォームは、ウィンドウを再作成した後に以前の状態を復元して、これをスムーズに見せるのに非常にうまく機能します。しかし、ところどころ漏れがあります。そして、いくつかの完全なバグ。TreeView の 1 つのリークは、どのノードが折りたたまれているか、どのノードが折りたたまれていないかという正確な状態です。これを追跡することは、実際的ではありません。

これを診断するには、TreeView の Handle プロパティをウォッチ ウィンドウに配置します。変化が見られる場合は、プロパティを見つけたことになります。スタイル フラグのリストはこちらから入手できます。おそらく、それらの名前を対応するプロパティにマップできます。

おそらく、そのプロパティの変更を回避する以外に、この問題に対する優れた回避策がないことは明らかです。このようなトラブルが WPF を生んだのです。

于 2009-07-22T01:12:51.227 に答える