La mise à jour de ToolStripProgressBar et ToolStripStatusLabel avec une action

Dans un Formulaire Windows, j'ai une boîte de recherche qui déclenche un événement à la recherche d'une base de données à distance et d'afficher certains résultats. La requête est assez rapide, habituellement seulement une fraction de seconde, mais dans le cas où le retard est perceptible, il y a une barre de progression et étiquette en forme de la barre d'état. Lorsque l'utilisateur clique sur "Rechercher" du statut de l'étiquette devrait apparaître et la barre de progression de montrer des progrès. Puis, quand le résultat revient l'étiquette doit disparaître et la barre de progression doit être pleine. Assez de réponse de base.

Le problème est, je ne peux pas obtenir ces actions dans cet ordre-là. À l'aide du code ci-dessous, cliquez sur "Rechercher", rien ne se passe jusqu'à ce que les résultats sont affichés, et puis la barre de progression se remplit de 0 à 100. L'étiquette n'apparaît jamais. J'ai même jeté dans une commande de mise en veille immédiatement après l'événement afin d'être sûr que je n'était pas seulement le manque, mais c'est comme si les 2 premières déclarations ne sont pas en cours d'exécution. Ce que je fais mal ici?

 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;
    }
  • Est-ce à Feu de méthode coup de pied dans un autre thread pour faire la requête de base de données? Si non, la raison pour laquelle vous ne voyez jamais l'étiquette, c'est que vous êtes à tout faire sur le même thread. Dans les Windows Forms, le thread principal est seul responsable pour la peinture des fenêtres et des contenus. Si il est suspendu jusqu'à exécution d'ADO.NET choses, alors il ne peut pas très bien obtenir autour de la remise en peinture de l'étiquette. Par le temps qu'il obtient en retour à l'entretien des contrôles " mise en page/peinture événements, il aura déjà fait la requête et le ramener à l'invisible.
  • Non, c'est un single-threaded app. L'événement se déroule de la base de données de requête à partir d'une autre classe, puis déclenche un autre événement à l'INTERFACE utilisateur de mettre à jour un tableau de résultats. Je comprends qu'il ne peut pas redessiner alors que c'est l'exécution de la requête, mais, vu le code ci-dessus, je pense que ce serait partiellement remplir la barre et l'affichage de l'étiquette avant de faire le backend choses, puis exécuter les 2 dernières lignes une fois que c'est terminé.
  • L'INTERFACE utilisateur ne sera pas de mise à jour jusqu'à ce que searchButton_Click() se termine. Vous devez exécuter la Requête sur un autre thread. Regarder dans BackgroundWorker.