ノードの編集中に TreeView の変更をコミットしますか (C#)?
質問
私はMicrosoftのTreeViewコントロールを使って遊んでおり、グリッドのUpdateDataと同様に、ノードのラベルを編集中にある種のデータ更新を強制しようとしています。
基本的に、私のエディタには [保存] ボタンと次の TreeView コントロールがあります。私が望んでいるのは、TreeView でノードのラベルを編集しているときに、[保存] ボタンをクリックすると、編集していたノードのラベルをコミットできるようにしたいということです。
解決
ノード ラベルの編集はテキスト ボックスで実行され、そのテキスト ボックスがフォーカスを失うと、名前の変更がノードの新しいラベルとしてコミットされます。したがって、クリックしている「保存」ボタンがフォーカスを取得すると、テキスト ボックスがフォーカスを失うため、自動的に更新が行われます。
「保存」ボタンがフォーカスを取得しない場合は、「保存」ボタンのクリック イベントを処理し、現在のラベル編集を終了するようにツリーに要求する必要があります。メソッド/プロパティがない場合は、呼び出してラベル編集の終了をリクエストできるため、2 つの選択肢があります。ツリー ビューにフォーカスがある場合は、別の場所にフォーカスを置きます。あるいは、ラベル編集を再度オフ/オンにします...
treeView.LabelEdit = false;
treeView.LabelEdit = true;
他のヒント
実際には文書化されていない場合でも、回答を受け入れます。そのような方法はありますか、それともありませんか?あなたは実際にはこれに答えず、ただ質問を私に返しただけです。
一方、他のコントロールにフォーカスを強制するという同じハックっぽい解決策を見つけました(あまりエレガントではありませんが、機能します)。ただし、UserControlの一部としてTreeViewを使用しているため、私にとっては少し難しくなります。
本当に保存ボタンが必要ですか?
たとえば、TreeView の KeyDown イベントの「return」キーをリッスンすることで、ノード編集の終了をリッスンできます。何かを編集している場合 (SelectedNode.IsEditing で調べます)、コミットがあることがわかります。次に、これを dataupdate にコミットできます。多くの異なるノードを編集し、最後にすべて保存できるようにしたい場合は、編集した各ノードを何らかのコレクションに追加し、保存ボタンをクリックすると、このコレクションを反復処理する必要があります。