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

Windows Forms Discussion :

[C#VS2005]Evenement + remplissage de datagridView


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    75
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2007
    Messages : 75
    Points : 49
    Points
    49
    Par défaut [C#VS2005]Evenement + remplissage de datagridView
    Bonjour

    Je dévellope une appli qui recoit des trames(venant d'une pompe a essence) via le port série de mon PC et je les stocks dans un fichier texte les décomposes par la suite pour les affichés dans un DataGridView.

    Du coup mon appli doit tourné en non Stop sur le PC j'utilise donc l'evenment du port séries qui se déclenche lorsque celui ci recoit une trame.

    Cependant je voudrai afficher ma trame dans le dataGridView une fois la trame recu et décomposé sans avoir a appuyer sur un bouton.Malheuresement cela me retourne un message d'erreur lié a un thread

    System.InvalidOperationException was unhandled

    Message="Opération inter-threads non valide*: le contrôle '' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé."


    Et pas de chance j'y connais pas grand chose en thread à part la théorie.

    Voici mon code :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                string reponse = receptionTrame();                           //Réception de la trame émise via le port série
     
                lectureTxt();
            }
     
            /* *                                                                                                                    * *
             *                          LECTURE DU FICHIER TEXTE ET EXPORT VERS LE DATAGRIDVIEW                                       *
             * *                                                                                                                    * */
            private void lectureTxt()
            {
                StreamReader read = new StreamReader(path);     //Ouverture d'un flux de lecture de fichier vers "C:\trame\trame.txt"
     
                int i=0;
                string[] trameRetour = new string[10];          //tableau de chaine de retour
     
                dataGridView1.Rows.Clear();                     //Vidage du DataGridView
     
                i = 0;
                while (!read.EndOfStream)                       //Boucle tant que le flux de lecture arrive à la fin du ficher
                {                               
                    string lecture = read.ReadLine();           //Récupération de la ligne du ficher dans une varaible
     
                    if (lecture != "\n" && lecture != "")      //test si la trame est vide ou correspond a un saut de ligne
                    {
                        trameRetour =  decomposeTrame(lecture);             //Décompose la trame passé en paramétre
                        dataGridView1.Rows.Add();                           //Ajoute une ligne au DataGridView
                        dataGridView1[0, i].Value = i + 1;                  //Numéro de la trame 
                        dataGridView1[1, i].Value = trameRetour[1];         //Champs correspondant aux colones  
                        dataGridView1[2, i].Value = trameRetour[2];         //
                        dataGridView1[3, i].Value = trameRetour[3];         //
                        dataGridView1[4, i].Value = trameRetour[4];         //
                        dataGridView1[5, i].Value = trameRetour[5];         //
                        dataGridView1[6, i].Value = trameRetour[6];         //
                        dataGridView1[7, i].Value = trameRetour[7];         //
                        dataGridView1[8, i].Value = trameRetour[8];         //
                        dataGridView1[9, i].Value = trameRetour[9];         //
                        dataGridView1[10, i].Value = trameRetour[10];       //           
                        i++;
                    }                
                }
                read.Close();                                               //Fermeture du flux de lecture
            }
    d'avance merci et en espérant que vous pouriez m'aider

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Salut,

    un contrôle graphique (comme la DGV) ne peut être modifié que dans le thread de la fenêtre dans lequel il est. Regarde la doc de InvokeRequired et de BeginInvoke, qui sont tous les deux membres de System.Windows.Forms.Form, pour plus de détails. Le forum de dvp.com aussi contient quelques discussions à ce sujet.
    ಠ_ಠ

  3. #3
    Membre du Club
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    75
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2007
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Merci

    Désoler pour le retard je n'était pas au taf pour tester (week end oblige)

    je viens de tester avec le BeginInvoke et ca marche super bien cela est assez redoutable et ca m'enleve une enorme épine du pied.

    je laisse le code final pour ceux que ca pourrai interesser.

    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
    16
     
     
            public delegate void InvokeDelegate(); 
     
            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                string reponse = receptionTrame();                           //Réception de la trame émise via le port série
     
                BeginInvoke(new InvokeDelegate(invokeLectureTxt));   //appel de la methode BeginInvoke et appel de la methode invokeLectureTxt dans le delegate
            }
     
     
            private void invokeLectureTxt()
            {
                lectureTxt();  //Appel de ma methode lectureTxt()
            }
    Je vous met aussi le lien msdn qui ma pas mal aider
    surtout l'exemple c#

    http://msdn.microsoft.com/fr-fr/libr...y3(VS.80).aspx

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

Discussions similaires

  1. Evenement DataError et Datagridview
    Par misa dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/12/2010, 22h09
  2. Problèmes Evenement dans un DataGridView
    Par Loubna.B dans le forum C#
    Réponses: 10
    Dernier message: 07/07/2009, 17h37
  3. Contrôle evenements clavier ds Datagridview
    Par twitty20 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/06/2008, 16h37
  4. [.NET C# VS2005] Soucis sur un DataGridView
    Par NeraOne dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/05/2007, 14h00
  5. [VS2005][VB.NET] tri datagridview
    Par JPelli dans le forum Windows Forms
    Réponses: 6
    Dernier message: 20/03/2007, 15h49

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