Aktualisierung ToolStripProgressBar und ToolStripStatusLabel zusammen mit mit einer Aktion
In einem Windows-Formular habe ich ein Suchfeld, feuert ein Ereignis zu suchen, eine remote-Datenbank und zeigt einige Ergebnisse. Die Abfrage ist ziemlich schnell, in der Regel nur einen Bruchteil einer Sekunde, aber im Falle der Verzögerung ist bemerkbar, es ist ein Fortschritt-Balken und die Beschriftung in form der status-bar. Wenn der Benutzer klickt auf "Suche" den status soll die Beschriftung angezeigt, und der Fortschrittsbalken zeigen einige Fortschritte. Wenn dann das Ergebnis kommt zurück, das label verschwindet und der Fortschrittsbalken voll sein sollten. Ziemlich einfache Antwort.
Das problem ist, ich kann nicht diese Aktionen geschehen in dieser Reihenfolge. Mit dem code unten, ich "Suche" klicken, passiert nichts, bis die Ergebnisse angezeigt werden, und dann der Fortschrittsbalken füllt sich von 0 bis 100. Das label nie erscheint. Ich selbst warf in einem sleep-Befehl ist unmittelbar nach der Veranstaltung sicher sein, ich war nicht nur fehlt es, aber es ist, als wenn die ersten 2 Anweisungen werden nicht ausgeführt. Was mache ich hier falsch?
private void searchButton_Click(object sender, EventArgs e)
{
toolStripStatusLabel1.Visible = true;
toolStripProgressBar1.Value = 20;
m_changeRequestedEvents.Fire<String>("SearchTerm", searchTextBox.Text);
toolStripProgressBar1.Value = 100;
toolStripStatusLabel1.Visible = false;
}
Nein, dies ist ein single-threaded-app. Das event läuft eine DB-Abfrage aus einer anderen Klasse, die dann löst ein anderes Ereignis, um die Benutzeroberfläche zu aktualisieren, Ergebnisse-Tabelle. Ich verstehe, dass es nicht streichen, während es läuft die Abfrage, aber angesichts der oben genannten code, den ich würde denken, dass es teilweise zu füllen die bar und die Anzeige der Bezeichnung bevor zu tun backend-Sachen, dann führen Sie die letzten 2 Zeilen, sobald es fertig ist.
Die UI wird nicht aktualisiert, bis searchButton_Click() abgeschlossen ist. Sie benötigen zum ausführen der Abfrage in einem anderen thread. Schauen Sie in der BackgroundWorker-Klasse.
InformationsquelleAutor Travis Christian | 2010-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code bereitgestellt werden, ändert sich die Benutzeroberfläche Attribute, aber den thread nicht aktualisiert, die Benutzeroberfläche bis nach searchButton_Click gibt. Also die änderungen vor der Veranstaltung werden nie angewendet, weil Sie nicht durch die änderungen nach, die dann angewendet, wenn die Methode zurückgibt.
Statt, die Aktualisierung der Benutzeroberfläche Attribute vor dem abfeuern der Veranstaltung:
event-handler ausführen der Abfrage in einem separaten thread (BackgroundWorker), so dass die Benutzeroberfläche aktualisieren können, in der Zwischenzeit:
aktualisieren Sie dann die Benutzeroberfläche wieder in der Methode, die aufgerufen wird, wenn der BackgroundWorker-thread abgeschlossen ist:
InformationsquelleAutor Travis Christian