質問

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

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

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

私が試してみました:

  • ツリービューのbeforecollapseイベントをフックし、cancelactionフラグを上げます。

  • TreeViewのAfterSelectイベント内のすべてのノードを手動で拡張します。(これは実験として正常に機能しますが、ノード崩壊を許可するつもりはありません
    まったく!)

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

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


アップデート:

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

.SelectedImageIndex プロパティ変更コードを .BeginUpdate() および .EndUpdate() 呼び出しで囲もうとしましたが、無駄でした。

どうすればこれを回避できるでしょうか?

役に立ちましたか?

解決

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

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

Windowsフォームでは、これがスムーズに見えるようにウィンドウを再作成した後に以前の状態を復元するのはかなり良い仕事をしていません。しかし、それは漏れがあちこちにあります。そして、いくつかのあからさまなバグ。ツリービュー内の一つの漏れは、ノードが縮小されたとされていない正確な状態です。このを追跡することだけでは現実的ではありません。

ウォッチウィンドウでツリービューのHandleプロパティを置くことによって、これを診断します。あなたはそれを変更する表示された場合は、プロパティを発見しました。スタイルフラグのリストは、利用可能なここで、あなたはおそらく彼らの対応するプロパティに自分の名前をマップすることができます。

おそらくそのプロパティを変更する回避以外のこの問題の偉大な回避策は、存在しないことは明らかです。このようなトラブルは、WPFを生んだものです。

scroll top