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

ismalife Messages postés 193 Date d'inscription jeudi 25 novembre 2010 Statut Membre Dernière intervention 11 janvier 2011
15 déc. 2010 à 14:06
lol alors bon courage
mais prend ton temps, c'est pas vraiment urgent à vrai dire
j'ai encore deux mois pour le terminer, et je ne suis vraiment pas en retard
0
BunoCS Messages postés 15318 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 6 octobre 2022 103
15 déc. 2010 à 14:19
Bon voilà. En fait, dans la fonction CreerGraphique, tu crée l'histo, tu le remplis et tu le formate. Je te conseillerais de mettre le code de style dans une méthode spéciale. Ainsi, tu pourras l'appeler dans la méthode Tick.
Est-ce que la dernière ligne de la méthode Tick est vraiment nécessaire (invalidate)? C'est elle qui te fout ton style en l'air à mon avis.

De manière plus générale, il faut que tu revoies ton code:
- supprimes le code mort, dont tu ne te sert plus
- mets plus de variables membres: genre zedGraphControl1, filePath,... ça t'évitera de les passer en arguments
- 50 ms pour ton timer!? C'est trop rapide. Je vois que ton xml est sur internet: pour ne pas te faire blacklister par le serveur, je te conseille de passer à 10 minutes, c'est amplement suffisant

j'ai encore deux mois pour le terminer, et je ne suis vraiment pas en retard

euh...2 mois pour faire un widget?! Sans être méchant, c'est plus que suffisant...

@+
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
15 déc. 2010 à 14:31
Oui je sait bien que c'est plus que suffisant. il me reste deux mois et j'en ai déjà entamé un....
Donc no panique, faut que je prenne me temps. C'est pour ça que ton aide m'est utile. Merci également à Shao.
j'apprend beaucoup sur ce forum.....

qu'appel tu le "code mort sinon" ? jamais entendu parler de ça.
0
BunoCS Messages postés 15318 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 6 octobre 2022 103
15 déc. 2010 à 14:35
le "code mort" c'est le code non utilisé, qui n'est jamais appelé par le programme

@+
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

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
15 déc. 2010 à 14:40
ok ok vais regarder tout ça tranquillement et je te retiens au courant

merci pour ta patience
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 36
17 déc. 2010 à 20:05
Salut,

Voici le code que j'ai reussit à faire

mais je trouve que le fichier XML aurait du être fait de maniere plus
simple
du style
  
   <ca mois=""11"">28692.82</ca>
   <ca mois=""12"">11738.35</ca>
   <ca mois=""1"" prec=""prec"">19827.12</ca>
   <ca mois=""2"" prec=""prec"">14928.46</ca>

les traitements auraient ete plus simple il me semble.


    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())
                {
                    NumberFormatInfo provider = new NumberFormatInfo();

                    provider.NumberDecimalSeparator = ",";
                    provider.NumberGroupSeparator = ".";
                    provider.NumberGroupSizes = new int[] { 3 };
                    string[] tab = item.Name.LocalName.Split('_');
                    int mois = Convert.ToInt32(tab[tab.Length - 1]);

                    if (!dico.ContainsKey(mois))
                    {
                        dataPoco d = new dataPoco();
                        d.mois = mois;
                        d.valeur = Convert.ToDouble(item.Value, provider);
                        dico.Add(mois, d);
                    }
                    else
                    {
                        dico[mois].valeurPrec = Convert.ToDouble(item.Value, provider);
                    }
                }

                var list = (from c in dico.Values
                            select c).ToList();
                dataGridView1.DataSource = list;
            }
        }

        private void DrawGraph()
        {
            //    chart1.DataSource = datacollection;
            //     chart1.Series[0].
        }

        private void LoadData()
        {
            data = @"<stat>
  <ca_1>28275.62</ca_1>
  <ca_2>24057.57</ca_2>
  <ca_3>30730.60</ca_3>
  <ca_4>25599.90</ca_4>
  <ca_5>23995.63</ca_5>
  <ca_6>25427.58</ca_6>
  <ca_7>26232.15</ca_7>
  <ca_8>29093.91</ca_8>
  <ca_9>29657.87</ca_9>
  <ca_10>28085.00</ca_10>
  <ca_11>28692.82</ca_11>
  <ca_12>11738.35</ca_12>
  <ca_prec_1>19827.12</ca_prec_1>
  <ca_prec_2>14928.46</ca_prec_2>
  <ca_prec_3>25272.96</ca_prec_3>
  <ca_prec_4>19623.87</ca_prec_4>
  <ca_prec_5>21904.70</ca_prec_5>
  <ca_prec_6>21048.11</ca_prec_6>
  <ca_prec_7>22198.30</ca_prec_7>
  <ca_prec_8>23601.44</ca_prec_8>
  <ca_prec_9>25253.49</ca_prec_9>
  <ca_prec_10>24434.42</ca_prec_10>
  <ca_prec_11>25627.56</ca_prec_11>
  <ca_prec_12>22124.15</ca_prec_12>
</stat>
";
        }
    }

    public class dataPoco
    {
        public int mois { get; set; }
        public double valeur { get; set; }
        public double valeurPrec { get; set; }
    }
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 à 09:51
SALUT

oulala je crois que tu tombe à pic
vais essayé. Car malgré tout ce qu'on ma donné ça marche pas

merci beaucoup
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 à 10:02
Merci de détailler le probleme.

A quelle point ou tu es rendu et l'erreur que tu as?
Ce que tu as fait.

Le but de mon code était juste de décomposer la source, en un truc plus exploitable pour alimenter tes graphes.

Apres si tu ne veux pas de collections, il faut traduire la fin avec des array par exemple ou autres choses.
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 à 10:12
dans le code loadData() que tu ma donné on lui indique quand meme des valeurs xml.
Est ce qu'il va se servir de ces valeurs pour construire le graphe ?
Car moi les valeurs que je souhaite ce sont des valeurs qui varient ds le temps.
Donc elle ne sont jamais les meme. J'ai essayé un timer mais il me foire tout
au niveau de mon style.
J'ai un datagridview que j'ai mis en vertical également avec plein de style et au raffraichissement
j'ai les bonnes valeurs qui s'affichent mais le style est tout pourri. (affichage horizontal, plus de couleur .....).

Merci
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 à 10:23
Sinon dans la methode drawGraph() il faut mettre quoi car j'ai déjà une methode qui ressemble à ça :

private void CreerGraphique(ZedGraphControl zgc)
        {
            string filePath = "http://www.beautefrance.com:8080/script/widget_statsvente.php";
            XmlTextReader txtReader = new XmlTextReader(filePath);

            statsdataset.Clear();
            statsdataset.ReadXml(txtReader);
            dataGridView1.DataSource = statsdataset;
            
            dataGridView1.DataMember = "stat";


            GraphPane myPane = zgc.GraphPane;

            // titre et nomination des axes x et y
            myPane.Title.Text = "Histogramme";
            myPane.XAxis.Title.Text = "Mois de l'année";
            myPane.YAxis.Title.Text = "Chiffres d'Affaires";

            // Points de données
            double[] y0 = { 19827.12, 14928.46, 25272.96, 19623.87, 21904.70, 21048.11, 22198.30, 
                              23601.44, 25253.49, 24434.42, 25627.56, 22124.15 };
            double[] y1 = { 28275.62, 24057.57, 30730.60, 25599.90, 23995.63, 25427.58, 26232.15, 
                              29093.91, 29657.87, 28085.00, 28692.82, 3668.93 };
            string[] str = { "Janv.", "Févr.", "Mars", "Avr.", "Mai", "Juin", "Juill.", 
                                "Août", "Sept.", "Oct.", "Nov.", "Dec." };
            

            // creation des batons
            BarItem myCurve = myPane.AddBar("Année 2009", null, y0, Color.Red);
            BarItem myCurve1 = myPane.AddBar("Année 2010", null, y1, Color.Green);

            
            // Fill the axis background with a color gradient
            myPane.Chart.Fill = new Fill(Color.White,
               Color.FromArgb(255, 255, 166), 45.0F);

            zgc.AxisChange();

            // expand the range of the Y axis slightly to accommodate the labels
            myPane.YAxis.Scale.Max += myPane.YAxis.Scale.MajorStep;

            // Create TextObj's to provide labels for each bar
            BarItem.CreateBarLabels(myPane, false, "f0");

            // dessine les nouvelles valeurs de X à la place des anciennes
            myPane.XAxis.MajorTic.IsBetweenLabels = true;
            // appel du nouvel affichage des abcisses
            myPane.XAxis.Scale.TextLabels = str;
            // Mis en place du nouveau texte des abcisses 
            myPane.XAxis.Type = ZedGraph.AxisType.Text;

            PointPairList hList = new PointPairList();
            myPane.XAxis.Type = ZedGraph.AxisType.Text;
            // une graduation en X est egal à 1 mois
            myPane.XAxis.Scale.MajorStep = 1;
            myPane.XAxis.Scale.MajorUnit = DateUnit.Month;
            // Renverser les labels des abcisses de 65°
            myPane.XAxis.Scale.FontSpec.Angle = 65;
            myPane.XAxis.Scale.FontSpec.IsBold = true;
            myPane.XAxis.Scale.FontSpec.Size = 12;
            myPane.XAxis.Scale.Format = "M";

        }

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 à 11:13
Pour le load data, bien sur c'est un jeu de test.
As-toi d'aller lire sur le reseau.

Pour la partie rafraichissement
base toi sur le code suivant.

http://www.vbfrance.com/forum/sujet-ACCELERER-TRACE-GRAPHE_1485002.aspx

Attention de ne pas faire tomber le serveur :-) en l'interrogant trop souvent, car si les chiffres que tu recherche c'est des CA mensuels ca sert à rien de l'interroger toutes les 5 secondes.


J'ai complété un peu ton code
remplace ton code par celui la
dans la portion // Points de données

En mettant list en private List<dataPoco> list; de ta classe et virant le var dans mon code précédent.

Attention, il y a peut etre plus optimisé, mais pour l'instant avec zedgraph ca marche.

            // Points de données
            double[] y0 = (from c in list select c.valeur).ToArray();
            double[] y1 = (from c in list select c.valeurPrec).ToArray();
            string[] str = { "Janv.", "Févr.", "Mars", "Avr.", "Mai", "Juin", "Juill.", "Août", "Sept.", "Oct.", "Nov.", "Dec." };



J'ai pas compris ton histoire de datagridview.
Le code suivant à l'air de fonctionner.

  
private void ReLoadCustomers(object sender, EventArgs e)
        {
            //chart1.DataSource = listCustomers;
            //chart1.DataBind();
            dataGridView2.DataSource = null;
            dataGridView2.DataSource = list;
        }

        private void dataGridView2_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                Random r = new Random();
                //Vérification de la valeur dans la colonne Statut
                if (Convert.ToInt16(dataGridView2.Rows[e.RowIndex].Cells["mois"].Value) < r.Next(1, 12))
                {
                    e.CellStyle.BackColor = Color.LightGreen;
                }
                else
                {
                    e.CellStyle.BackColor = Color.Purple;
                }
            }
        }
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 à 11:19
Oui le code fonctionne mais c'est au moment du raffraichissement que le style fou le camp
pourquoi ? je ne sais pas. Sinon je programme en c# alors le lien que tu m'a donné je crois pas qu'il va me servir lol

j'essaie ton autre bout de code

a tt de suite

encor merci
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 à 11:22
A quoi correspond list dans ce code car il me le souligne en me disant qu'il n'existe pas dans le contexte actuelle
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 à 11:27
Tu ne sais pas lire

En mettant list en private List<dataPoco> list; de ta classe et virant le var dans mon code précédent.

....

Le code sur le site vbfrance est en c#....
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 à 11:32
oui désolé vais voir lol
c'est juste que je ne suis pas une star c'est tout
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 à 11:38
Il y a pas besoin d'etre une star, juste de savoir lire.


Plus optimisé, il me semble
            DataSourcePointList dsp = new DataSourcePointList();
            dsp.DataSource = list;
            dsp.XDataMember = "mois";
            dsp.YDataMember = "valeur";

            DataSourcePointList dsp2 = new DataSourcePointList();
            dsp2.DataSource = list;
            dsp2.XDataMember = "mois";
            dsp2.YDataMember = "valeurPrec";

            GraphPane myPane = zedGraphControl1.GraphPane;
            BarItem myCurve3 = myPane.AddBar("Année 2010", dsp, Color.DarkViolet);
            BarItem myCurve4 = myPane.AddBar("Année 2009", dsp2, Color.Green);

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 à 11:45
pas besoin d'etre une star ok c vrai
mais quand on est débutant ben on comprend pas tout.

merci j'essaie
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 à 11:53
<CA Men
// Points de données
            double[] y0 = (from c in list select c.valeur).ToArray();
            double[] y1 = (from c in list select c.valeurPrec).ToArray();

            string[] str = { "Janv.", "Févr.", "Mars", "Avr.", "Mai", "Juin", "Juill.", 
                                "Août", "Sept.", "Oct.", "Nov.", "Dec." };


list est toujours souligné meme si j'ai modifié le code ici :

List<dataPoco> list = (from c in dico.Values
                            select c).ToList();
                dataGridView1.DataSource = list;


garde ton calme surtout
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 à 11:57
Tourne 7 fois le clavier, et lit 7 fois ce que je marque :-)

Réflechis un peu.

C'est la 3ieme fois que j'ecris ..
En mettant list en private List<dataPoco> list; de ta classe et virant le var dans mon code précédent.
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 à 12:23
En mettant list en private List<dataPoco> list; de ta classe et virant le var dans mon code précédent.

Mouais merci quand meme, mais ça marche pas.
Laissons tomber, vais essayer avec toutes les infos que j'ai, et on verra.

Je vois pas ce que tu veux dire, peut etre. Car de la manière dont j'ai l'ai compris c'est :
private List<dataPoco> list();
{

}


Mais bon apparemment je dois pas comprendre le français.

merci pour ta patience
0