Die TreeView in Windows Forms scheint immer einen Knoten ausgewählt zu haben, wenn der Fokus wiederhergestellt wird. Wenn ich keine Knoten ausgewählt habe und diese Baumansicht den Fokus erhält, erhalte ich ein AfterSelect
Ereignis mit dem ersten ausgewählten Knoten, obwohl ich es nicht mit der Tastatur, der Maus oder programmgesteuert ausgewählt habe. Die einzige Problemumgehung, die ich finden kann, ist zu überprüfen, ob TreeViewCancelEventArgs.Action
gleich TreeViewAction.Unknown
ist, und dann die Auswahl abzubrechen. Das scheint wirklich hacky zu sein, also frage ich mich, ob es noch eine andere Möglichkeit gibt, das zu beheben.Windows Forms TreeView wählt immer einen Knoten im Fokus aus
Antwort
Ich stimme zu, dass TreeViewAction.Unknown
in diesem Fall weniger als wünschenswert ist. Erwägen Sie die Verwendung des Ereignisses BeforeSelect
, das eine Möglichkeit bietet, das Ereignis AfterSelect
zu verhindern.
Erstellen Sie einen GotFocus
Event-Handler, der ein Flag setzt. Erstellen Sie dann einen BeforeSelect
-Event-Handler, der das Flag löscht, wenn das Flag gesetzt ist. Zum Beispiel:
private bool treeViewWasNewlyFocused = false;
private void TreeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
if(treeViewWasNewlyFocused)
{
e.Cancel = true;
treeViewWasNewlyFocused = false;
}
}
private void TreeView1_GotFocus(object sender, EventArgs e)
{
treeViewWasNewlyFocused = true;
}
Ich hatte das gleiche Problem genau über kommen (aber auf der Compact Framework), wo das Ereignis Before nicht ausgesetzt ist (ich war bummed).
Aber denken Sie, eine ziemlich elegent Lösung bekommen und Hoffnung könnte anderen helfen !!
Ich machte eine abgeleitete TreeView-Steuerelement (so könnte mehrere Elemente auf einmal auswählen), sondern auch korrigiert die "automatische" Auswahl des ersten Knoten beim Abrufen von FOCUS.
- public class TreeView_MultSel: System.Windows.Forms.TreeView
ich überwog dann die Event-Handler als solche:
/// <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;
}
ich meine Version dieses Problem gelöst, indem TabStop aus für die Baumansicht.
Meine Version des gleichen Problems mit folgendem Code behoben.
private TreeNode _selectedNode;
public FormMain()
{
InitializeComponent();
myTreeView.LostFocus += (sender, args) => _selectedNode = myTreeView.SelectedNode;
myTreeView.GotFocus += (sender, args) => myTreeView.SelectedNode = _selectedNode;
}
das Problem gelöst durch TVM_SELECTITEM
mit lparam von 0.
- 1. Outlook 2007 TreeView in Windows Forms (C#)
- 2. Entfernen Sie einen Knoten aus einer TreeView
- 3. TreeView-Knoten-Hervorhebungsfarbe in C#
- 4. Html-Eingabe, immer im Fokus
- 5. hinzufügen Treeview Knoten durch einen Pfad
- 6. Disable Treeview Knoten
- 7. Associating Windows Forms TreeView Artikel zu aktuellen Daten
- 8. Halten von Windows Forms Picturebox in der Mitte von TreeView
- 9. Fehler im Windows Forms Editor
- 10. TreeView ausgewählten Knoten Problem
- 11. Databound Windows Forms Steuerelement erkennt Änderungen nicht, bis Fokus verloren
- 12. Fokus oder Wählen Textfeld in C# Windows Forms Anwendung
- 13. C# winforms TreeView wählt manchmal falsche Artikel
- 14. Kendo TreeView Knoten abwählen
- 15. Kopieren TreeView-Knoten
- 16. Bootstrap TreeView-Knoten traversing
- 17. CEdit wählt alles aus, wenn Fokus erhalten wird
- 18. SignalR in Windows Forms
- 19. Exit-Code aus der Windows Forms-App
- 20. .net cf 3.5 treeview Checkbox nur für den angegebenen Knoten
- 21. TreeView lädt nur Top-Knoten
- 22. Einfache Objektbindung an Treeview-Knoten
- 23. TreeView-Steuerelement in C#, wählen Sie() und Fokus
- 24. windows forms
- 25. Ziehen Sie ein Element von Treeview zu ListBox auf Windows Forms (C#)
- 26. Windows Forms-Steuerelemente in einem scrollbaren Steuerelement und Ereignisse
- 27. C# XPath wählt einige untergeordnete Knoten nicht aus
- 28. aciTree Fokus auf Knoten
- 29. Fokus in Safari 4 Beta wählt Inhalt
- 30. Windows Forms - ToolStripItem Sichtbare Eigenschaft ist immer auf "false" gesetzt
Was mit diesem Code geschieht sendet, wenn ein Knoten, wenn die Baumansicht des Fokus erhält, ist. Wenn "BeforeSelect" nicht ausgelöst wird, bleibt treeViewHasNewlyFocused True. Meine Vermutung ist, dass dies dazu führen würde, dass die nächste absichtliche Knotenauswahl vom Benutzer abgebrochen wird. –
Ich verwende das BeforeSelect-Ereignis, um abzubrechen. Ich verwende ein Flag, aber ich verwende ein Flag, um anzugeben, ob die Baumansichtsauswahl programmgesteuert erfolgt, da die für eine programmgesteuerte Auswahl gemeldete Aktion als "Unbekannt" gemeldet wird. Das scheint zu funktionieren, aber es scheint, dass dieses Verhalten ein Fehler im TreeView-Steuerelement ist, da das Verhalten keinen Sinn ergibt und ich es nirgends dokumentiert sehe. –