2016-05-26 6 views
1

Ich habe winforms Projekt mit TreeView drin. Manchmal, wenn ich einen Gegenstand auswähle, wird ein anderer Gegenstand ausgewählt. Ich bin mir sicher, dass es keinen Code gibt, der die Auswahl überschreiben könnte.C# winforms TreeView wählt manchmal falsche Artikel

https://www.dropbox.com/s/qutmu0tmrkjspc6/disablederrortreeview.rar?dl=0

Hier ist Beispielprojekt. Ich muss die Baumansicht aktualisieren, so dass es einen Timer gibt, der seinen Inhalt regelmäßig aktualisiert (so dass einmal pro Sekunde Elemente abgewählt werden), aber wenn er schnell genug klickt, wählt er manchmal andere Elemente aus, auf die ich nicht geklickt habe.

Weiß jemand, was das Problem sein könnte? Gibt es eine Problemumgehung, die das verhindern könnte?

Danke

Jakub

+0

Ich werde nicht in Ihr Projekt eingraben. Aber wenn es einen 1Hz Timer gibt, der parallel zu den Benutzerklicks läuft, würde ich sicherlich Interferenz erwarten. Vielleicht können Sie den Timer beim Eintreten/Verlassen stoppen/starten ..? – TaW

Antwort

1

Zwei Handlungs:

können Sie entweder: Während die Auswahl geschieht das Tick Ereignis deaktivieren:

bool selecting = false; 

private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
{ 
    selecting = true; 
} 

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 
{ 
    selecting = false; 
    // maybe you want to call the Tick now: 
    // timer1_Tick(null, null); 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    if (selecting) return; 
    // do your stuff 
    .. 
} 

Alternativ Sie die Auswahl deaktivieren könnte während die Tick läuft:

bool ticking = false; 
TreeNode clickedNode = null; 

private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
{ 
    e.Cancel = ticking; 
    clickedNode = e.Node; 
} 


private void timer1_Tick(object sender, EventArgs e) 
{ 
    ticking = true; 
    // do your stuff 
    ticking = false; 
    // try to select the clicked node 
    if (clickedNode != null) 
     { treeView1.SelectedNode = clickedNode; clickedNode = null;} 
} 
+0

Vielen Dank für die Antwort, aber ich habe Angst, dass der Timer das Problem nicht verursacht. Selbst wenn Sie den Timer deaktivieren, wird beim Klicken auf TreeView manchmal das falsche Element ausgewählt. –

+0

In diesem Fall muss irgendwo Code sein, der alles durcheinander bringt. Schauen Sie sich die Before/AfterSelection-Ereignisse an und vielleicht auch andere Verdächtige wie die Click-, MouseUp-/Down-/Click-Ereignisse. – TaW

+0

Deshalb habe ich diese App erstellt, es gibt keinen Code, der die TreeView modifiziert, außer Timer Tick, was nur passiert einmal pro Sekunde. Abgesehen von den Ticks sollte es also nicht zu Klicks von Nutzern kommen. Ich denke, es ist ein seltsamer Winforms-Bug, vielleicht ist es in WPF behoben, aber ich muss Winforms verwenden. –

Verwandte Themen