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. JavaScriptでTreeViewの選択ノードを取得
- 3. ASP.NET:複数のTreeViewノードを選択するには?
- 4. 選択、フォーカス、または常に(jQuery)でiPadキーボードを表示
- 5. TreeViewは選択したアイテムの青色を表示します
- 6. TreeViewノードの画像インデックスは、選択時に変更されます
- 7. RadTreeViewで選択したノードの親ノードを取得していますか?
- 8. Web.configの子ノードの値に基づいてノードを選択します。
- 9. すべてのjTextFieldのフォーカスをすべて選択します
- 10. c#:別のフォームがフォーカスされている間に、テキストボックス内のテキストの選択を表示します。
- 11. TreeViewコントロールで選択されたすべての親(ルートまで)のノードを取得するには?
- 12. XML文書内からノードを選択していますか?
- 13. XMLノードを選択していますか?
- 14. 選択した子ノードを削除しているDOM
- 15. TreeViewからノードを削除します
- 16. GridViewで選択したグリッドにフォーカスを設定するには
- 17. バインドC#WindowsフォームのTreeViewデータベース
- 18. C#windowsフォームアプリケーションのフォーカスまたは選択テキストボックス
- 19. Jquery val()は、選択されている最初の選択値を常に取得します。
- 20. 選択したフォームの変更でタブを選択しない
- 21. リストボックス複数選択は常にすべてを選択
- 22. WPF TreeViewキャンセルTreeViewItemの選択
- 23. TreeViewでの複数選択
- 24. ViewModelからTextBoxのテキストをフォーカスして選択する方法
- 25. 選択していないタブでフォームを検証する
- 26. フォーカスを返し、jqueryを使用してテキストを選択します
- 27. C#WindowsフォームTreeView LabelEditの後にソート
- 28. Silverlight Toolkit Treeview:選択したアイテムの親を取得する
- 29. TVirtualStringTreeで選択したノードをロックするには?
- 30. ウィンドウのフォーカスを常にチェックしています
のLPARAMと
TVM_SELECTITEM
を送信することによって、問題を解決しました。 BeforeSelectは呼び出されず、treeViewHasNewlyFocusedはtrueのままです。私の推測では、これはキャンセルされているユーザーから次の意図的なノード選択につながるだろうということです。 –キャンセルするBeforeSelectイベントを使用します。私はフラグを使用しますが、フラグを使用して、プログラムによる選択に対して報告されたアクションが「不明」として報告されるため、ツリービュー選択がプログラムによって行われているかどうかを指定します。それはうまくいくようですが、この振る舞いはTreeViewコントロールのバグだと思われます。振る舞いは意味をなさないため、どこにも文書化されていません。 –