Rafraichissement de données en windows form

Résolu
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011
- 15 déc. 2010 à 10:10
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011
- 23 déc. 2010 à 11:12
Bonjour, me revoici pour ceux qui me connaissent (bientot tout le forum) lol

J'ai une nouvelle question concernant mon projet : et oui il n'est pas encore fini. Il me reste 2 mois de stage
alors autant prendre son temps afin qu'il soit le plus beau des gadgets (hi hi).

Alors ce widget m'affiche des données xml dans un datagridview, et ensuite un histogramme me compare les CA de chaque mois
pour deux années (année en cours et année précédente).
Etant donnée que les valeurs de mon XML varient ds le temps ( à chaque commande .... LOGIQUE !!!), ce que je souhaiterais faire
c'est un rafraichissement de l'histogramme.
Mais voilà, après avoir codé je me rends compte que lorsque le rafraichissement à lieu (timer), tout le style est remis en cause. Car en effet ayant choisit un affichage vertical du datgridview, au rafraichissement celui-ci redeviens horizontal, et c'est tout moche. Et mon histogramme ne se rafraichit pas du tout.

Je pense que la methode du timer est mal codé, ou alors pas placé au bonne endroit (je ne sais pas).
Ou peut etre dois je créer plusieurs timer. un pour l'histo et un autre pour le datagridview.
Je ne sais pas du tout. Voilà les questions que je me pose.

Donc si quelqu'un à un peu de patience je le remercie d'avance

90 réponses

nhervagault
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
20 déc. 2010 à 12:55
Ce que je dis c'est

private List<dataPoco> list; 


ou 

private List<dataPoco> list = new List<dataPoco>();


Est-ce plus clair??
0
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011

20 déc. 2010 à 13:33
ok en fait juste
List<dataPoco> list = new List<dataPoco>();
suffit
car en mettant private ça met des erreurs.

Voilà je n'ai plus aucune erreur, ça compile mais toujours pas d'histogramme.
0
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011

20 déc. 2010 à 13:43
Par contre j'ai quand meme la légende qui s'affiche.
Mais ce qui est des batons, ya rien et ce qui est des mois sur l'abcisse non plus
0
nhervagault
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
20 déc. 2010 à 14:07
Voici ce que j'ai

   public Form1()
        {
            InitializeComponent();
            LoadData();
            readData();
            DrawGraph();

        }

 private void readData()
        {
.....etc......
                list = (from c in dico.Values // pas de var ici ce que j'ai dis 3 fois :-)
                            select c).ToList();
                dataGridView1.DataSource = list;
            }
        }

        private List<dataPoco> list;//variable en private membre de classe

    
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011

20 déc. 2010 à 14:20
Ah d'accord je comprends
excuse de mettre autant autant de temps.

sinon y'a autre "var" dans le code :
  private void readData()
        {
            using (XmlReader nodeReader = XmlReader.Create(new StringReader(data)))
            {
                nodeReader.MoveToContent();
                XDocument xRoot = XDocument.Load(nodeReader, LoadOptions.SetLineInfo);

                Dictionary dico = new Dictionary();
                foreach (var item in xRoot.Descendants("stat").Descendants())  // var item
                {
                    NumberFormatInfo provider = new NumberFormatInfo();


faut faire comme avec l'autre ?
0
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011

20 déc. 2010 à 14:21
ET JE SUPPOSe que (new StringReader(data))) // ici data c'est le chemin du fichier ???
0
nhervagault
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
20 déc. 2010 à 14:33
Pour info
http://www.zedgraph.org/wiki/index.php?title=Display_Dynamic_or_Real-Time_Data

Un code pour faire bouger ton graphe.


Pour l'autre var c'est un code de faignant, ca remplace le type en c#3.5 et + .


Non pas ici c'est pas un fichier
  private void LoadData()
        {
            data = @"<stat>
  <ca_1>28275.62</ca_1>................."

C'est marqué sur la page
http://www.csharpfr.com/forum/sujet-RAFRAICHISSEMENT-DONNEES-WINDOWS-FORM_1486228.aspx?p=3
0
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011

20 déc. 2010 à 14:39
car il me souligne data dans les deux cas.
bref............
ok ok ça avance lol j'ai bien mon histogramme

et il se base sur le xml loadData() qui ne sont pas les bonnes valeurs en réalité.

donc je fais un timer ?
0
nhervagault
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
20 déc. 2010 à 15:38
data est bien sur à remplacer avec ta source de données.

Apres pour le timer les 2 exemples doivent t'aider?

Ensuite un peu de logique, et il ne doit pas avoir de probleme.
0
BunoCS
Messages postés
15304
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
27 septembre 2022
103
20 déc. 2010 à 15:42
Hello isma!
Encore des soucis?
Aller, tu n'es plus très loin à présent, grâce à l'aide de nhervagault...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
0
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011

20 déc. 2010 à 15:54
Merci a tous de votre patience.
Ce forum a été très utile.
merci nhervagault pour ces petits cours très interressant qui m'ont fait comprendre pas mal de chose
merci buno d'etre intervenu régulièrement
et merci shao de m'avoir aidé a commencer et d'etre egalement intervenu
0
BunoCS
Messages postés
15304
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
27 septembre 2022
103
20 déc. 2010 à 15:58
Tu es en vacances alors maintenant?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
0
Shaolyne
Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
8 mars 2011
1
20 déc. 2010 à 15:58
Toutes mes félicitations
C'est un plaisir de rendre service, n'hésites pas à redemander de l'aide à l'occasion

Bonnes fêtes à tous,
Shao.
0
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011

20 déc. 2010 à 16:07
Oui je suis en vacance à partir de jeudi.
hé hé et après encore 2 mois pour parfaire l'affichage.
Car je rappelle que mon problème de datagridview n'est pas encore réglé
lors du rafraichissement
Mais je posterai après les vacances, en temps voulu
Alors les gars je compte sur vous

bonne fetes à vous
0
nhervagault
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
20 déc. 2010 à 16:17
Expliques ton probleme avec un peu de code pour le datagriview

Car chez moi, avec le code que je t'ai donné, j'ai pas de problème.
0
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011

20 déc. 2010 à 16:33
OK
Alors dejà voici le contexte : j'ai un datagridview que j'ai programmé de manière à avoir
un affichage vertical. donc pour ça j'ai créer une methode flip() et une methode qui initialise ma nouvelle
pour l'affichage verticale. ensuite je retourne ces deux methodes à mon datagbridview.
Je fait un timer, lorsque celui-ci s'execute, cool il va bien chercher les nouvelles valeurs et les mets dans mon datagridview. Sauf que le problème est que mon datagridview redevient horizontal et que tout le style
que j'ai appliqué est "négligé".

Voici maintenant le code des methodes d'inversion :

// retourne la methode de l'affichage vertical
private form_load
{
            ds = new DataSet();
            dt = new DataTable();

            dt = GetStats();
            ds.Tables.Add(dt);

            DataView my_DataView = ds.Tables[0].DefaultView;
            this.dataGridView1.DataSource = my_DataView;

            DataSet new_ds = FlipDataSet(ds);
            my_DataView = new_ds.Tables[0].DefaultView;
            this.dataGridView1.DataSource = my_DataView;
}


 private static DataTable GetStats()
        {
            //Initialisation de notre dataTable afin d'inverser
            DataTable table = new DataTable();
            table.TableName = "stats";

            table.Columns.Add("Chiffres d'Affaires", typeof(string));
            table.Columns.Add("Prix Moyen Produit", typeof(string));
            table.Columns.Add("Prix Moyen Commande", typeof(string));
            table.Columns.Add("CA Moyen / Jour", typeof(string));
            table.Columns.Add("CA / Mois", typeof(string));
            table.Columns.Add("Nombres de Commandes", typeof(string));

            table.Rows.Add(new object[] { "315472.97", "21.79", "51.57", "976.52", "15624.32", "303" });
            table.AcceptChanges();
            return table;
        }

        public DataSet FlipDataSet(DataSet my_DataSet)
        {
            // methode qui inverse notre dataTable
            DataSet ds = new DataSet();

            foreach (DataTable dt in my_DataSet.Tables)
            {
                DataTable table = new DataTable();

                for (int i = 0; i <= dt.Rows.Count; i++)
                { table.Columns.Add(Convert.ToString(i)); }

                DataRow r;
                for (int k = 0; k < dt.Columns.Count; k++)
                {
                    r = table.NewRow();
                    r[0] = dt.Columns[k].ToString();
                    for (int j = 1; j <= dt.Rows.Count; j++)
                    { r[j] = dt.Rows[j - 1][k]; }
                    table.Rows.Add(r);
                }
                ds.Tables.Add(table);
            }
            return ds;           
        }
0
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011

20 déc. 2010 à 16:35
Ce que j'aimerais c'est que tu puisse me montrer ( sans vouloir abuser ) pas à pas comment
appeler le timer car j'ai essayé de toute les manières et rien à faire
ça marche mais le style est pourri
0
nhervagault
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
20 déc. 2010 à 17:01
//dans le form load lancement du timer1

            timer1.Tick += new EventHandler(timer1_Tick);
            timer1.Enabled = true;
            timer1.Interval = 2000;//2 secondes
            timer1.Start();



//un peu de donnée aléatoire
// à toi de voir pour tes données modif dans getStats
Random r = new Random();
            table.Rows.Add(new object[] { r.Next(1, 10000).ToString(), r.Next(1, 10000).ToString(), r.Next(1, 10000).ToString(), r.Next(1, 10000).ToString(), r.Next(1, 10000).ToString(), r.Next(1, 10000).ToString() });
           



//Ce qu'on fait à chaque lancement de timer ie LoadDT
 private void timer1_Tick(object sender, EventArgs e)
        {
            EventHandler reLoadCustomers = new EventHandler(LoadDT);
            this.Invoke(reLoadCustomers, new object[] { null, null });
        }


//On mets à jour les stats 
 private void LoadDT(object sender, EventArgs e)
        {
            DataSet ds = new DataSet();
            ds.Tables.Add(GetStats());
            DataSet new_ds = FlipDataSet(ds);
            DataView my_DataView = new_ds.Tables[0].DefaultView;
            this.dataGridView1.DataSource = my_DataView;
        }


C'est pas trop complexe a part le invoke.
C'est plus propre que LoadDT(this, null); dans le timer1_Tick pour des raisons de threads
0
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011

21 déc. 2010 à 09:13
salut nhervagault....

ok j'essaie tout ça et je te tiens au courant

merci
0
ismalife
Messages postés
193
Date d'inscription
jeudi 25 novembre 2010
Statut
Membre
Dernière intervention
11 janvier 2011

21 déc. 2010 à 09:40
ok ok j'ai bien remplacé la ligne dans GetStat() par le random.
j'ai testé et effectivement l'affichage reste bien verticale mais avec des valeurs
aléatoires. Puis quand meme la couleur et la largeur des cellules qui s'en va ( ce qui est moins grave pour
l'instant ).
Je continu de voir par rapport à ce qui est du random afin d'afficher les vrais valeurs
et je te redis
0