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 :

rafraichir un datagridview toute les x secondes [Débutant(e)]


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 20
    Points : 6
    Points
    6
    Par défaut rafraichir un datagridview toute les x secondes
    Bonjour

    je suis debutant. Je voudrais savoir s il est possible de rafraichir un datagridview dans une windows form toutes les x secondes ? je charge le fichier xml avec un dataset. j ai essaye de mettre un timer mais ca ne marche pas.

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    using System.Xml.Linq;
     
     
    namespace XML
    {
        public partial class Form1 : Form
        {
     
     
     
            public Form1()
            {
                InitializeComponent();
     
     
                DataSet ds = new DataSet();
                ds.ReadXml("C:\\prog\\sites.xml");
                dataGridView1.DataSource = ds.Tables[0];
                dataGridView1.ClearSelection();
    this.dataGridView1.RowsDefaultCellStyle.BackColor = Color.Black;
                this.dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Gray;
                this.dataGridView1.GridColor = Color.Black;
     
    this.dataGridView1.Columns["name"].DisplayIndex = 0;
                this.dataGridView1.Columns["technical"].DisplayIndex = 1;
                this.dataGridView1.Columns["url"].DisplayIndex = 2;
    this.dataGridView1.RowHeadersVisible = false;
                dataGridView1.AutoResizeColumns();
                dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                dataGridView1.AutoResizeRows();
                dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                this.dataGridView1.Font = new System.Drawing.Font("Microsoft Sans  Serif",40.0F,System.Drawing.FontStyle.Regular);
    void Form1_Load(object sender, EventArgs e)
             {
                 this.timer1.Enabled = true;
                 this.timer1.Interval = 1000;
                 this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
            }
     
     private void timer1_Tick(object sender, EventArgs e)
     {
         this.dataGridView1.refresh();
     }
     
     
     
            }
    Je vous remercie d'avance pour votre aide

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    Bonjour,

    Il va falloir que tu nous expliques ce que tu veux faire vraiment.

    Ton code ci-dessus fait:

    Tu charges un DataSet avec un XML 1 fois dans le constructeur.
    Puis tu as un Timer qui Refresh toutes les secondes ta DataGridView.

    Mais les données de la DataGridView ne sont jamais modifiées. Donc rien de va changer...
    C'est peut-être les données que tu veux modifier toutes les secondes dans le Timer?
    Tox

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    merci pour votre reponse, voila pourquoi ca ne marche pas .

    le fichier Xml sera modifie par une autre workstation ( par le reseau et a une heure aleatoire) donc il faut que je recharge mon datagridview periodiquement en entier.
    voila pourquoi je dois tous rafraichir.

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    donc il faut que je recharge mon datagridview periodiquement en entier
    résolu ?
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    non je n'arrive toujours pas a recharger le dataset dans le datagrid. j ai toujours les anciennes donnee afficher dans le datagridview. le fichier XML n est pas grand juste 40 lignes donc pas de soucis pour le recharger en entier. ( pas trop grand) .
    Mon probleme est que je ne sais pas comment faire pour recharger a partir du timer.

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Dans le code du timer, mettre au minimum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                dataGridView1.DataSource = null;
                ds.Remove(ds.Tables[0];
                ds.ReadXml("C:\\prog\\sites.xml");
                dataGridView1.DataSource = ds.Tables[0];
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    meri graffito pour ta reponse.

    je viens d'ajouter le code dans le timer

    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
     
      void Form1_Load(object sender, EventArgs e)
            {
                this.timer1.Enabled = true;
                this.timer1.Interval = 1000;
                this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
            }
     
            private void timer1_Tick(object sender, EventArgs e)
            {
                dataGridView1.DataSource = null;
                ds.Remove(ds.Tables[0]);
                ds.ReadXml("C:\\prog\\sites.xml");
                dataGridView1.DataSource = ds.Tables[0];
            }
    visual studio 2010 me donne une erreur dans le code du timer.
    the name ds does not exist in the current context

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public partial class Form1 : Form
    {
      private DataSet ds ;
      
      public Form1()
      {
          InitializeComponent();
          ds = new DataSet();
          ...
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    merci graffito pour ton precieux aide

    oui l 'erreur venait de la. merci beaucoup.
    j ai un warning

    Warning 1 Field 'XML.Form1.ds' is never assigned to, and will always have its default value null C:\Users\nova\Documents\Visual Studio 2010
    donc j ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Dataset ds = null;

    j'ai une erreur a cette ligne mais je l'ai corrige, je ne sais pas si c est correct.

    a la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ds.Remove(ds.Tables[0]);
    erreur :
    no overload for method Remove table 1 argument
    j'ai remplace cette ligne par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ds.Tables.Remove(ds.Tables[0]);
    j ai compile mais ca ne marche pas , ca ne s'actualise pas.

  10. #10
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Pour debuger, utilise un bouton au lieu d'un timer et vérifie :
    1. que le fichier XML est bien modifié,
    2. que, après le ds.ReadXml(), ds.tables[0] contient bien les nouvelles valeurs du XML
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  11. #11
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    le fichier XML est bien modifie, je le fait manuellement sous excel. J ai mis les 2 breakpoints sur (sous visual studio 2010):
    les breakpoint sont toujours rouge rien ne se passe, j ai fait le test avec une messagebox et elle s affiche.Mon probleme est du a ces deux lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     dataGridView1.DataSource = null;
     ds.Remove(ds.Tables[0]);
    l'application se ferme donc je ne peux pas verifie si le dataset est vide.

    Je me demande s il est possible de vider un dataset en cours d affichage avec le datagridview. ( supposition).

  12. #12
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Si tu exécutes juste dans un Button_Click :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dataGridView1.DataSource = null;
    MessageBox.show("DataSource cleared") ;
    tu devrais voir un dataGridView vide .
    Si tu exécutes aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ds.Remove(ds.Tables[0]);
    ds.ReadXml("C:\\prog\\sites.xml");
    dataGridView1.DataSource = ds.Tables[0];
    MessageBox.show("DataSource reloaded") ;
    Le DataSet devrait se recharger avec les nouvelles valeurs et être de nouveau visible dans le dataGridView.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  13. #13
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    oui, ca marche avec le bouton je vois le datagridview se vider.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataGridView1.DataSource = null;
    apres ca ne marche pas l apli se crash.
    ds.Remove....la methode n existe pas, intellisense ne le voit pas sous vs2010.

    pour ce qui est du timer, j ai essayer d'attrapper l'erreur ( try, catch)
    apparement l erreur est:
    cross thread operation non valid : control
    j essaye de modifie quelque chose qui est dans un autre thread... oups ca se complique....

  14. #14
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    pour le Remove :
    ds.Tables.Remove(ds.Tables[0]);
    Est-ce que tu as bien créé le Timer en conception ?

    Explication :
    • Les System.Windows.form.Timer s'exécutent dans le thread principal de la fenêtre (c'est ce qu'on veut).
    • Les System.Timers.Timer ns'exécutent dans un thread séparé qui ne peutr pas modifier les Control.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

Discussions similaires

  1. Rafraichir un label toute les secondes
    Par timiti29 dans le forum wxPython
    Réponses: 2
    Dernier message: 16/04/2010, 16h50
  2. Réponses: 4
    Dernier message: 06/11/2007, 11h44
  3. Mettre à jour les if et variable toute les x seconde.
    Par Guillaume602 dans le forum C++
    Réponses: 5
    Dernier message: 06/12/2005, 19h09
  4. [Thread]Lancer mon programme toutes les 60 secondes?
    Par danje dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 24/11/2005, 21h55
  5. [MFC] rafraichissement toute les X secondes
    Par benahpets dans le forum MFC
    Réponses: 4
    Dernier message: 22/06/2005, 10h53

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