6
votes

Remplissez DataGridView merci à Backworker

J'ai cet extrait de code: xxx

et voici la méthode getallacte : xxx

quoi J'aime faire est de remplir mon datagridview à l'aide de l'ouvrier d'arrière-plan une fois que j'exécuterais l'application, j'ai eu cette erreur:

Fonctionnement inter-thread non valide: Contrôle 'DataGridView1 a fait l'objet d'un accès d'un fil autre que celui créé.


J'essaie ceci xxx

mais rien n'a gagné dans le temps ?. J'aimerais que la mise à jour de DataGrid lorsque la BGW charge les données Fush Data Load on l'ajoutez à la DGV


0 commentaires

4 Réponses :


4
votes

Vous ne pouvez pas mettre à jour l'interface utilisateur à partir d'un fil d'antécédents.

Vous devez envoyer un événement à l'interface utilisateur, puis avoir quelque chose comme: p>

private void EventHandler(object sender, YourEventArgs e)
{
    if (this.dataGridView1.InvokeRequired)
    {
        this.dataGridView1.Invoke((MethodInvoker)delegate { this.AddToGrid(e.YourData); });
    }
    else
    {
        this.AddToGrid(e.YourData);
    }
}


0 commentaires

3
votes

C'est parce que les trucs d'interface graphique ne peuvent pas être modifiés à partir d'autres threads que le fil de l'interface graphique. Pour résoudre ce problème, vous devez appeler les modifications sur le thread de l'interface graphique à l'aide du répartiteur.

Le DataGrid doit être configuré à l'avance, de sorte que tout ce que vous faites dans votre fonctionnement Async est remplir les données. P>

var data = ActeServices.getAllActes(0, 40);

Dispatcher.BeginInvoke( new Action( () => { dataGridView1.DataSource = data; }))


0 commentaires

3
votes

Le dataGridView n'est pas un fil de sécurité. Cependant, définir la source de données si les données sont déjà disponibles doivent être suffisamment rapides.

Je recommanderais:

  1. Utilisez uniquement votre travail d'arrière-plan pour charger les données dans un autre thread

  2. Définissez la DataSource et les autres modifications du DataGridView dans l'événement RunworkerComplet (vous pouvez transmettre le résultat de la méthode Dowork à l'événement terminé en réglant

    E.Result = acteservices.getallactes (0, 40);

  3. Facultatif: Définissez DataGridView1.Autogeneratecolumns sur FAUX et ajoutez manuellement les colonnes dans les formulaires Windows Forms Designer ou dans le code pour éviter le scintillement.


1 commentaires

+1 - J'étais au milieu de taper une réponse similaire lorsque celle-ci est apparue.



1
votes

La classe Travailleur de fond a été conçue pour exécuter une opération de longue date sur un fil d'arrière-plan. Étant donné que vous n'êtes autorisé à accéder à des composants d'interface utilisateur du fil qui les a créés, vous pouvez utiliser le RunworkCompleted Événement de la classe de l'entreprise d'information Pour mettre à jour votre interface utilisateur une fois que votre gestionnaire de Dowork est terminé. De plus, vous pouvez mettre à jour en toute sécurité un interface utilisateur de progression à l'aide du progressée événement de la classe des opérateurs de fond.


0 commentaires