WindowsフォームのTreeViewは、フォーカスを取り戻すときに常にノードを選択するように見えます。ノードが選択されておらず、ツリービューにフォーカスがある場合は、キーボード、マウス、またはプログラムを使用して選択していないのに、最初のノードが選択されたAfterSelect
イベントが発生します。唯一の解決策は、TreeViewCancelEventArgs.Action
がTreeViewAction.Unknown
と等しいかどうかを確認してから、選択をキャンセルすることです。これは本当にハッキーなので、これを修正する別の方法があるのだろうかと思います。WindowsフォームTreeViewは常にフォーカスしているノードを選択します
4
A
答えて
6
この場合、TreeViewAction.Unknown
を使用することが望ましいとは限りません。 BeforeSelect
イベントを使用することを検討してください。AfterSelect
イベントを防止する機会があります。
フラグを設定するイベントハンドラGotFocus
を作成します。次に、BeforeSelect
イベントハンドラを作成します。このハンドラは、フラグが設定されている場合、イベントをキャンセルしてフラグをクリアします。例:
2
BeforeSelectイベントが公開されていない(コンパクトなフレームワーク上で)これと同じ正確な問題が起きていました(私はうんざりでした)。
しかし、かなりエレガントな解決策があると思って、他人を助けるかもしれないと思ってください!
派生TreeViewコントロールを作成しました(複数のアイテムを同時に選択できるようになりました)が、FOCUSを取得する際に最初のノードの「自動」選択も修正されます。
- パブリッククラスTreeView_MultSel:私は、その後のようなイベントハンドラをオーバーライドSystem.Windows.Forms.TreeView
:
/// <summary>
/// //This actually occurs AFTER actual Treeview control:
/// - Got Focus in reality
/// - Executed the "innate" behaviour (like a button showing "depressed")
/// - The "innate and UNWANTED behaviour of the Treeview is to selected the first Node
/// when gets the focus.
///The key here is the Treeview executes in this order (when Tree Selected and didn't have focus):
/// - First the Node is selected (before OnGotFocus is executed)
/// Since when LostFocus "treeHasFocus" = false the OnAfterSelect handler isn't called!!
///
/// - Then the OnGotFocus is called:
/// This will set treeHasFocus to True and will not react to selections
/// </summary>
/// <param name="e"></param>
protected override void OnGotFocus(EventArgs e)
{
treeHasFocus = true;
//base.OnGotFocus(e);
}
/// <summary>
/// Alot easier to handle here (in Derived TreeView control then using all kinds of
/// -= events to try to prevent.
///
/// This was the cleanest way I could find (prevent firing of AfterSelect)
/// </summary>
/// <param name="e"></param>
protected override void OnLostFocus(EventArgs e)
{
treeHasFocus = false;
//base.OnLostFocus(e);
}
/// <summary>
/// - Treeview Control defaults to selecting the first node (when gets focus)
/// - We do NOT want this - since would automatically Highlight the first node (select)
/// - treeHasFocus is NOT true for the first unwanted "automatic" selection of the first item
/// - Upon loosing Focus, the AfterSelect handler is never called.
/// </summary>
/// <param name="e"></param>
protected override void OnAfterSelect(TreeViewEventArgs e)
{
if (treeHasFocus)
base.OnAfterSelect(e);
this.SelectedNode = null;
}
4
私はオフタブストップを回すことにより、この問題の私のバージョンを解決ツリービューのために。
0
同じ問題の私のバージョンを次のコードで修正しました。
private TreeNode _selectedNode;
public FormMain()
{
InitializeComponent();
myTreeView.LostFocus += (sender, args) => _selectedNode = myTreeView.SelectedNode;
myTreeView.GotFocus += (sender, args) => myTreeView.SelectedNode = _selectedNode;
}
0
は、ツリービューがフォーカスを取得したときに選択されたノードがある場合、このコードで何が起こる0
関連する問題
- 1. TreeViewの選択されたノードに対する新しいノードの追加
- 2. TreeViewのどのノードが選択されていますか(PySide)?
- 3. TreeViewで選択したノードのインデックスを取得する
- 4. JavaScriptでTreeViewの選択ノードを取得
- 5. ASP.NET:複数のTreeViewノードを選択するには?
- 6. HTMLAgilityPack選択ノードは常にnullを返します
- 7. 選択、フォーカス、または常に(jQuery)でiPadキーボードを表示
- 8. TreeViewは選択したアイテムの青色を表示します
- 9. JS Tree - すべての子ノードが選択されているときに親ノードを選択します。
- 10. 他のフォームのTreeViewノード
- 11. 実際にはTreeView(.NET)内のすべてのノードの選択を解除します
- 12. DjangoフォームはChoiceFieldで常に無効です - 有効な選択肢を選択してください
- 13. TreeViewノードの画像インデックスは、選択時に変更されます
- 14. ジェンキンスマスター(ヘッドレス)ノードでネイティブWindowsピッカーを使用してファイルを選択
- 15. CommonOpenFileDialog(選択ディレクトリ)を呼び出しているWPF/Prismウィンドウは、選択後にフォーカスが失われます
- 16. バインドC#WindowsフォームのTreeViewデータベース
- 17. すべてのjTextFieldのフォーカスをすべて選択します
- 18. 色を選択してくださいTreeView
- 19. jqueryでフォーカスしてテロリズムのテキストボックスを選択しようとしています
- 20. 剣道UI for MVC - TreeView - 子ノードのみを選択
- 21. c#:別のフォームがフォーカスされている間に、テキストボックス内のテキストの選択を表示します。
- 22. TreeViewコントロールで選択されたすべての親(ルートまで)のノードを取得するには?
- 23. C#windowsフォームアプリケーションのフォーカスまたは選択テキストボックス
- 24. RadTreeViewで選択したノードの親ノードを取得していますか?
- 25. Web.configの子ノードの値に基づいてノードを選択します。
- 26. GridViewで選択したグリッドにフォーカスを設定するには
- 27. TreeViewからノードを削除します
- 28. C#TreeView、子ノードが選択されたときのイベント
- 29. コンテキストメニューとしてのTreeViewアイテムのWPF選択は
- 30. C#WindowsフォームTreeView LabelEditの後にソート
のLPARAMと
TVM_SELECTITEM
を送信することによって、問題を解決しました。 BeforeSelectは呼び出されず、treeViewHasNewlyFocusedはtrueのままです。私の推測では、これはキャンセルされているユーザーから次の意図的なノード選択につながるだろうということです。 –キャンセルするBeforeSelectイベントを使用します。私はフラグを使用しますが、フラグを使用して、プログラムによる選択に対して報告されたアクションが「不明」として報告されるため、ツリービュー選択がプログラムによって行われているかどうかを指定します。それはうまくいくようですが、この振る舞いはTreeViewコントロールのバグだと思われます。振る舞いは意味をなさないため、どこにも文書化されていません。 –