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;
    }
Hat dieses Feuer-Methode kick-off ein weiterer thread für die Datenbank-Abfrage? Wenn nicht, ist der Grund, warum Sie nie sehen, das label ist, dass du tust alles, was auf dem gleichen thread. In Windows-Forms -, der Haupt-thread ist verantwortlich für die Lackierung der Fenster und Inhalte. Wenn es aufgehängt ist die Durchführung ADO.NET Zeug, dann kann es nicht sehr gut bekommen rund um die re-painting the label. Durch die Zeit wird es wieder zu Wartungsarbeiten Kontrollen " layout/paint-events, wird es bereits getan haben, die zum Abfragen und setzen Sie es wieder auf unsichtbar.
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

Schreibe einen Kommentar