IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème UI et MAJ Dataset


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 246
    Points : 123
    Points
    123
    Par défaut Problème UI et MAJ Dataset
    Salut,

    Une application charge un Dataset à partir d'une base de données Access sur un disque distant. C'est long donc je veux que l'utilisateur soit averti que l'appli n'est pas bloquée.
    J'ai créé une fenêtre dans laquelle j'ai une icône, un bouton cancel etc ... Bref, j'ai fais une dialogbox (une form en showdialog) de téléchargement.
    A l'ouverture la DialogBox lance un backgroundworker pour traiter les données puis se ferme une fois le backgroundworker achevé ou le cancel effectué.

    C'est ici que ça se corse. J'essaye de recharger la base de données dans le DataSet (parce qu'un autre utilisateur aurait modifié la MDB par exemple).
    Lorsque je re-fill les tables, je reçois le message suivant :

    L'exception suivante s'est produite dans le DataGridView :

    System.IndexOutOdRangeException: L'index 0 n'a pas de valeur.
    à System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
    à System.Windows.Forms.DataGridViewDataConnection.GetError(Int32 rowIndex)

    ...
    En cherchant j'ai déterminé que mon problème vient du fait que mon re-fill se fait dans un autre thread.

    J'ai donc mis le tout dans un invoke comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    this.Invoke(new MethodInvoker(delegate()
                    {
                this.GlobalDataSet.Clear();
                this.entetePointTableAdapter.Fill(this.GlobalDataSet.EntetePoint);
                this.groupeTableAdapter.Fill(this.GlobalDataSet.Groupe);
                this.parcelleGroupeTableAdapter.Fill(this.GlobalDataSet.ParcelleGroupe);
                this.parcelleTableAdapter.Fill(this.GlobalDataSet.Parcelle);
                this.ligneTableAdapter.Fill(this.GlobalDataSet.Ligne);
                this.pointTableAdapter.Fill(this.GlobalDataSet.Point);
                this.pCodeTableAdapter.Fill(this.GlobalDataSet.PCode);
                this.GlobalDataSet.Groupe.IdGroupeColumn.AutoIncrementSeed = (long)groupeTableAdapter.MaxIdGroupe() + 1;
                    }
                    )
                    );
    Cela fonctionne presque. Je n'ai plus le message d'erreur, mais maintenant c'est ma dialogbox qui semble gelée. La dialogbox s'ouvre, mais tous ses controles sont blancs. Probablement parce que l'UI n'est plus sur la dialogbox à cause du invoke. Mais comment faire pour résoudre ce problème ?

    Merci de vos z'avis z'avisés,
    JM

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Jean-Marc68 Voir le message
    En cherchant j'ai déterminé que mon problème vient du fait que mon re-fill se fait dans un autre thread.
    Effectivement ça semble probable
    En fait, vu que ton DataGridView est bindé au dataset, une modif du dataset provoque une modif du DGV, donc si ça se fait sur un autre thread.... boom !

    Citation Envoyé par Jean-Marc68 Voir le message
    Cela fonctionne presque. Je n'ai plus le message d'erreur, mais maintenant c'est ma dialogbox qui semble gelée.
    Eh oui, puisque le thread UI est occupé à charger le DataSet.

    En fait, pour que ça fonctionne, il faut désactiver les bindings le temps de faire le Fill du dataset, et les remettre après (dans le cas du DataGridView, mettre DataSource à null devrait suffire)

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 246
    Points : 123
    Points
    123
    Par défaut
    Merci de ta réponse tomlev.

    J'y ai pensé, mais j'ai pensé que mettant le datasource à null puis en le remettant les colonnes du dgv se seraient rechargées et qu'il aurait fallu remettre de l'ordre dans tout ça (colonnes visibles, ordre des colonnes, etc ...) mais ça n'a pas l'air d'être le cas.

    Mais penses-tu qu'il y ait un moyen pour que le thread UI recharge le Dataset et qu'il y ait toutefois un moyen d'afficher une fenêtre type showdialog de téléchargement ?

    Merci.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Jean-Marc68 Voir le message
    Mais penses-tu qu'il y ait un moyen pour que le thread UI recharge le Dataset et qu'il y ait toutefois un moyen d'afficher une fenêtre type showdialog de téléchargement ?
    Non, ce n'est pas possible ; si le thread UI est occupé à charger le DataSet, il ne peut pas en même temps gérer l'affichage d'un dialogue.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 246
    Points : 123
    Points
    123
    Par défaut
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème suppression et MAJ dans un arbre
    Par scary dans le forum C
    Réponses: 12
    Dernier message: 22/06/2009, 17h12
  2. Problème avec datagridview et dataset
    Par CenToRy dans le forum VB.NET
    Réponses: 1
    Dernier message: 20/11/2008, 18h56
  3. [MySQL] Problème requête après MAJ serveur
    Par ingeniomatique dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/03/2008, 13h57
  4. [C#][2.0]Problème de Delete avec DataSet Typé
    Par genki dans le forum Accès aux données
    Réponses: 2
    Dernier message: 04/01/2007, 13h42
  5. Problème rewriting depuis MaJ Mandriva 2007
    Par mao-40 dans le forum Apache
    Réponses: 1
    Dernier message: 19/09/2006, 15h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo