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
21 déc. 2010 à 10:11
Je ne comprends pas ton probleme de couleurs.
Je t'ai donné le code, il y a quelques messages.

Expliques MIEUX
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 à 10:26
Ben je peux pas t'expliquer mieux que de te dire : les couleurs ne sont plus présente
au rafraichissement du datagridview. Le seul changement positif qu'il y ait c'est que
l'affichage reste vertical. Ce qui est déjà une bonne chose.
Pourtant j'ai bien vu tes messages.

Je précise que les couleurs de mon datagridview sont codés dans le form_load si ça peut t'aider.

ATTEND je retourne voir
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 36
21 déc. 2010 à 10:32
Les couleurs sont dans dataGridView1_CellFormatting??
0
BunoCS Messages postés 15318 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 6 octobre 2022 103
21 déc. 2010 à 10:37
les couleurs de mon datagridview sont codés dans le form_load

La méthode Load n'est appelée qu'une seule fois. C'est pour cela que tes couleurs disparaissent...

@+
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
21 déc. 2010 à 10:45
Non non la méthode cell_formating, s'occupe des couleurs de la page 2 de mon datagridview ( car j'ai 2 pages ).
Car dans la page 2 c'est un ajout de couleur qui se fait automatiquement en fonction de valeur invisible
( qui existe mais qui n'apparaissent pas dans mon datagridview ). La page 2 conserve son affichage horizontal.

La page 1, quand à elle les couleurs c'est juste pour un style perso, mais que je veux conserver.

salut buno ah ok, donc faudrait que je code le style de la page1 ailleurs que dans le form_load
comme pour le cell_formating
0
BunoCS Messages postés 15318 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 6 octobre 2022 103
21 déc. 2010 à 10:55
@+
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
21 déc. 2010 à 11:02
Oui buno, mais j'ai oublié de préciser qu'au rafraichissement meme la page2 est affecté.
lorsque je vais sur la page2, elle devient exactement comme la page1 sans style.
Ou devrais-je dire la page2 devient la page1. elle sont identiques au rafraichissement.
alors qu'elles se basent les 2 sur un fichier xml différent.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 36
21 déc. 2010 à 11:17
Essaies sur le changement de page
page 2 ---> page 1
de faire un datagridview1.Invalidate();
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 à 11:23
sur l'evenement click des boutons pages?? OK
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 à 11:35
Toujours la meme les gars. ça déconne.

Mais je pense à un truc, est-il obligatoire de faire un timer ?
Car pour l'histogramme j'es exclu l'idée du timer et ça fonctionne.

Vous qu'etes plutot bien calé dans le domaine, ne penseriez-vous pas qu'il serait préférable
de modifier la ligne suivante :

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));
            
            // modifier cette ligne pour qu'elle se base sur mon fichier xml, au lieu d'utiliser un timer
            table.Rows.Add(new object[] { "295092.46", "16.08", "36.77", "957.47", "23936.63", "651" });
            table.AcceptChanges();     
            return table; 
            table.AcceptChanges();
            return table;
        }


en gros comme pour ta méthode random mais au lieu de mettre des valeurs aléatoires, on va récupérer directement les valeurs du fichier xml
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 à 11:36
Je pense que c'est possible puisque avec l'histogramme ça a été possible.
Mais moi perso je sais pas trop comment faire.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 36
21 déc. 2010 à 12:10
???
Essaies d'etre plus precis.

Quel code as-tu dans le form_load?

J'ajoute ce code mais j'ai un probleme au chargement
la couleur n'est pas prise en compte
(si j'ajoute ce code dans le form load)


 private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {

            if (tabControl1.SelectedIndex == 1)
            {
                var dgc = dataGridView1.Rows[1].Cells[1];
                dgc.Style.BackColor = Color.Aqua;
            }
            else 
            {

                var dgc2 = dataGridView2.Rows[1].Cells[1];
                dgc2.Style.BackColor = Color.Red;
            }
        }
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 à 12:14
voici mon form_load sans le timer que je viens de supprimer :
namespace widget
{
    public partial class Form1 : Form
    {
        DataSet ds = null;
        DataTable dt = null;

        public Form1()
        {
            InitializeComponent();

            // retourne l'histogramme
            CreerGraphique(zedGraphControl1);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            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";

            // retourne le style lors du click sur le bouton de la page 1 
            this.dataGridViewStatStyle();

            // retourne la methode d'affichage vertical
            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;

            // on enleve le focus de selection
            this.dataGridView1.Rows[0].Selected = false;

            // style des colonnes du tableau
            dataGridView1.Columns[0].DefaultCellStyle.Font = new Font(Control.DefaultFont, FontStyle.Bold);
            dataGridView1.Columns[1].DefaultCellStyle.Font = new Font(Control.DefaultFont, FontStyle.Italic);
            dataGridView1.Columns[0].DefaultCellStyle.BackColor = Color.Wheat;
            dataGridView1.Columns[1].DefaultCellStyle.BackColor = Color.LightGray;

            // redimensionnement des colonnes par rapport a la largeur du widget
            dataGridView1.Columns[0].Width = 160;
            dataGridView1.Columns[1].Width = 80;
}
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 à 12:19
J'aimerais laisser comme ça et modifier juste la ligne suivante de la fonction GetStats():
private static DataTable GetStats()
        {
            // modifier cette ligne. Récupérer les valeurs xml (dynamiques) directement plutot que de mettre des valeurs
            // bidons comme ci-dessous, et ensuite utiliser un timer.
            table.Rows.Add(new object[] { "295092.46", "16.08", "36.77", "957.47", "23936.63", "651" });
            table.AcceptChanges();
            return table;            
        }



je souhaiterais sans timer si possible.
Il doit exister une façon d'aller chercher les valeurs réels.
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 à 13:39
 private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {

            if (tabControl1.SelectedIndex == 1)
            {
                var dgc = dataGridView1.Rows[1].Cells[1];
                dgc.Style.BackColor = Color.Aqua;
            }
            else 
            {

                var dgc2 = dataGridView2.Rows[1].Cells[1];
                dgc2.Style.BackColor = Color.Red;
            }
        }



il n'y a qu'un datagridview pour 2 affichages différents.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 36
21 déc. 2010 à 14:10
Pas compris

Un datagridview et 2 sources, c'est ça?
Si on a pas tous les éléments c'est compliqué de réfléchir

Pour la recuperation des données XML j'ai déjà fais tout le travail.

Pour le datagridview avec le flip des données cela n'a aucun sens
à moins que tu as n colonnes.
Et donc n courbes ou histogrphes sur ton dessin, comparer Chiffres d'Affaires et CA Moyen / Jour, j'en vois pas l'intéret.

Si tu n'es pas clair dans tes demandes, on ne peux pas trop t'aider.


Ne mets pas dans Form_load la partie de chargement de ton graph,
on a deja dis que c'etait appelé une seule fois.


   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;


Je ne vois pas l'interet d'attribuer deux fois la datasource à suivre.

Poses-toi 30 minutes?
Prends 1 papier 1 crayon, dessines ce que tu veux,
et l'ordre que tu veux. Car la ca va un peu dans tous les sens? Ta demande.

Et ca sera plus clair.
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 à 14:14
Ok vais faire un effort lol
C'est vrai que le plus compliqué c'est d'expliquer les problèmes
à tout de suite.
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 à 14:35
En effet j'ai 2 sources différentes (statsdataset et comdataset) pour 1 seul datagridview.
*statsdataset m'affiche: ca, nb_cmd, px_moy_prod, px_moy_commande, ca_mois, ca_jour
*comdataset m'affiche : date de commande, mode de paiement, total.

Je bascule d'un affichage à l'autre par l'intermediaire de 2 boutons : page1 et page2.
page1 : statsdataset et page2 : comdataset. Les deux sources j'y accède via URL.

VOILA DE CE QUI EST DE LA FORME DE MON WIDGET ( l'histo ici on s'en fout ).

Maintenant: la page2 je n'ai aucun problème avec, cela fonctionne.

la page1, celle qui m'affiche les "stats" quand à elle je veux inverser l'affichage, je veux un affichage
vertical, pour des raisons de style (afin de m'éviter d'avoir une barre de défilement horizontal).
Donc ce que je souhaite (plutot qu'un timer qui foire tout le style) c'est :

Y'a-t'il un moyen pour inverser ma table, comme la function GetStats() de mon programme, mais à la place
de mettre les valeurs que j'ai mise pour initialiser je souhaiterais récupérer directement les valeurs depuis le xml:
 table.Rows.Add(new object[] { "295092.46", "16.08", "36.77", "957.47", "23936.63", "651" });
                                          // ceci est faut, je désire un code qui récupère les données xml en direct
            table.AcceptChanges();
            return table;     


j'espere avoir été clair cette fois-ci

comparer Chiffres d'Affaires et CA Moyen / Jour, j'en vois pas l'intéret.

Mon histo compare le ca de 2 années (mois par mois).

L'histo c'est fini, le problème a été réglé hier
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 à 14:46
dans le cas présent donc par rapport à ligne de code ci-dessus, l'affichage est le suivant

ca ----> 295092.46

px_moy_prod ----> 16.08

px_moy_com -----> 36.77

caMoy/jour -----> 957.47

ca_mois -----> 23936.63

nb_cmd -----> 651

Voilà comment me l'affiche mon datagridview.
Les valeurs du code ci-dessus on les retrouves dans l'affichage.
Le problème c'est que ce ne sont pas les bonnes. ces valeurs sont obsolètes.
Ils me faut les valeurs actuelles.

Comprends-tu
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 36
21 déc. 2010 à 16:17
Bon j'ai été cherché ton XML sur ton site car tu me l'as pas montré.

voici un code à remettre un peu en forme pour tes besoins

//declaration des libelles 
private   List<String> libelles = new List<string>();

//chargement des libellés un peu au hasard
            libelles.Add("Chiffres d'Affaires");
            libelles.Add("Prix Moyen Produit");
            libelles.Add("Prix Moyen Commande");
            libelles.Add("CA Moyen / Jour");
            libelles.Add("CA Moyen / Mois");
            libelles.Add("Nombres de Commandes");
            libelles.Add("1");
            libelles.Add("2");
            libelles.Add("3");
            libelles.Add("4");
            libelles.Add("7");
            libelles.Add("5");
            libelles.Add("6");


//        Modification de la lecture du fichier xml     
foreach (var item in xRoot.Descendants("stat").Descendants())
                {
                    if (item.Name.LocalName.StartsWith("ca_")
                        && item.Name.LocalName != "ca_prec"
                        && item.Name.LocalName != "ca_mois"
                        && item.Name.LocalName != "ca_moyenne_jour")
                    {
................................
Déja fais
...................................
}
                    else 
                    {
                        dicoStat.Add(libelles[i], item.Value);
                        i++;
                    }

//chargement de la datagridview
// un peu de linq
            dataGridView1.AutoGenerateColumns = true ;
            dataGridView1.DataSource =(from kv in dicoStat
                                       from libelle in libelles
                                       where libelle == kv.Key
                                       select new { libelle, kv.Value }).ToArray();



//bonus (j'étais parti sur une autre piste 
//un peu de lambda si tu veux t'amuser
  dataStatPoco d2 = new dataStatPoco();
                d2.CA xRoot.Descendants("stat").Descendants().Where(x> x.Name == "ca").Select(x=>x.Value).FirstOrDefault();


Ca me permet de creuser les concepts au passage
linq2Xml j'avais pas encore fais.
0