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

C# Discussion :

zedGraph et dataset avec camembert


Sujet :

C#

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur Développement Logiciel
    Inscrit en
    Septembre 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Développement Logiciel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 290
    Par défaut zedGraph et dataset avec camembert
    Bonjour à tous,
    j'utilise zedGraph dans mon application pour faire des graphiques en camembert tous se passe bien sauf que toutes les portions ont la même couleur. J rappel la source de données de mes graphes est un dataset:
    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
     
    void RemplirDSGraphe(string SortieTop)
            {
                ///// On prépare les éléments du graphe            
     
                GraphPane myPane = zGControl.GraphPane;
                myPane.GraphObjList.Clear();
                zGInitialise(myPane);            
                try
                {
                    string myReq = Reqete(sortieTop, De.Text, Au.Text, cboSecteur.Text,
                        cboAnnonceur.Text, cboMarque.Text, cboSupport.Text, "TV");
                    double myTotal = 0d;
                    myTotal = double.Parse(totalTop.Text);
                    myTopAdap = new OdbcDataAdapter(mySQL, myGeneralClass.myCurcon);
                    myTopAdap.Fill(myTopDS, "Top" + SortieTop);
                    System.Data.DataTable myTopTable;
                    myTopTable = myTopDS.Tables["Top" + SortieTop];
                    int n=myTopTable.Rows.Count;
                    int m = myTopTable.Columns.Count;
                    ZedGraph.PieItem segment;
                    //int n = myTopDS.Tables["Top"].Rows.Count;                
                    for (int i=0; i <= n-1 ; i++)
                    {
                        for (int j = 1; j < m; j++)
                        {                        
                            Random myRand = new Random();
                            //string val = myTopTable.Rows[i][j].ToString();
                            double _val = double.Parse(myTopTable.Rows[i][j].ToString());
                            Color Color1 = Color.FromArgb(myRand.Next(150, 200), myRand.Next(200, 250), myRand.Next(100, 150));
                            Color Color2 = Color.FromArgb(myRand.Next(0, 50), myRand.Next(50, 100), myRand.Next(100, 150));
                            string Libelle = myTopTable.Rows[i][0].ToString();
                            double prCentage = (_val / myTotal)*100;
                            segment = myPane.AddPieSlice(_val, Color1, Color2, 45f, 0, Libelle+" "+prCentage.ToString()+"%");                        
                        }
                    }                    
                    // Somme des valeurs des tranche                                                               
                    CurveList curves = myPane.CurveList;
                    //totalTop.Text = myTotal.ToString();
                    TextObj text = new TextObj("Total Investissement FCFA  \n" + totalTop.Text + " FCFA",
                                   0.18F, 0.40F, CoordType.PaneFraction);
                    text.Location.AlignH = AlignH.Center;
                    text.Location.AlignV = AlignV.Bottom;
                    text.FontSpec.Border.IsVisible = false;
                    text.FontSpec.Fill = new Fill(Color.White, Color.FromArgb(255, 100, 100), 45F);
                    text.FontSpec.StringAlignment = StringAlignment.Center;
                    myPane.GraphObjList.Add(text);
     
                    // Create a drop shadow for the total value text item
                    TextObj text2 = new TextObj(text);
                    text2.FontSpec.Fill = new Fill(Color.Black);
                    text2.Location.X += 0.008f;
                    text2.Location.Y += 0.01f;
                    myPane.GraphObjList.Add(text2);
                    // Calculate the Axis Scale Ranges
                    zGControl.AxisChange();               
                }
    Les lignes me permettant d'ajouter les portions sont les suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double _val = double.Parse(myTopTable.Rows[i][j].ToString());
                            Color Color1 = Color.FromArgb(myRand.Next(150, 200), myRand.Next(200, 250), myRand.Next(100, 150));
                            Color Color2 = Color.FromArgb(myRand.Next(0, 50), myRand.Next(50, 100), myRand.Next(100, 150));
                            string Libelle = myTopTable.Rows[i][0].ToString();
                            double prCentage = (_val / myTotal)*100;
                            segment = myPane.AddPieSlice(_val, Color1, Color2, 45f, 0, Libelle+" "+prCentage.ToString()+"%");
    Or j'ai toujours les mêmes couleurs pour les différentes portions ajoutées. Quelqu'un a t-il une idées?

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Si tu regardes dans la MSDN la documentation sur l'objet Random, tu verrais que :

    La valeur initiale par défaut est dérivée de l'horloge système et a la résolution finie.En conséquence, les objets Random différents qui sont créés successivement par un appel au constructeur par défaut ont des valeurs initiales par défaut identiques et produisent ainsi des jeux identiques de nombres aléatoires. Ce problème peut être évité en utilisant un seul objet Random pour générer tous les nombres aléatoires. Vous pouvez également le contourner en modifiant la valeur de départ retournée par l'horloge système, puis en fournissant explicitement cette nouvelle valeur de départ au constructeur Random(Int32).
    Il faut donc :

    • initialiser le Random hors des deux boucles (inutile de le recréer à chaque fois de toute façon, c'est une perte de temps et de mémoire)
    • initialiser le Random avec une valeur différente à chaque fois dans la boucle en utilisant le contructeur Random(Int32).


    Je te conseille la première solution que tu peux d'ailleurs mixer à la seconde pour être sûr d'avoir des couleurs réellement aléatoires.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur Développement Logiciel
    Inscrit en
    Septembre 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Développement Logiciel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 290
    Par défaut
    De façon concrète comment devrait être le code concerné car j'ai quelque peu modifié en ceci mais rien y fit:
    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
     
    Random myRand = new Random(5);
                    for (int i=0; i <= n-1 ; i++)
                    {
                        Color Color1 = Color.FromArgb(myRand.Next(0,50), myRand.Next(200, 250), myRand.Next(100, 150));
                        for (int j = 1; j < m; j++)
                        {                                               
                            //string val = myTopTable.Rows[i][j].ToString();
                            myRand = new Random(10 * i + 20 * j);
                            double _val = double.Parse(myTopTable.Rows[i][j].ToString());
                            Color Color2 = Color.FromArgb(myRand.Next(0, 50), myRand.Next(50, 100), myRand.Next(100, 150));
                            string Libelle = myTopTable.Rows[i][0].ToString();
                            double prCentage = (_val / myTotal)*100;
                            segment = myPane.AddPieSlice(_val, Color1, Color2, 45f, 0, Libelle+" "+prCentage.ToString()+"%");                        
                        }
                    }

Discussions similaires

  1. [VB.NET] remplir dataset avec procedure stockée
    Par HULK dans le forum Windows Forms
    Réponses: 7
    Dernier message: 18/07/2006, 12h05
  2. [VB.Net] Comment updater Dataset avec un OledbCommandBuilder ?
    Par dyree dans le forum Accès aux données
    Réponses: 3
    Dernier message: 04/07/2006, 13h50
  3. [VB 2005]Dataset avec plusieurs tables
    Par estelledany dans le forum Windows Forms
    Réponses: 3
    Dernier message: 29/05/2006, 14h25
  4. [C#] Remplissage d'un DataSet avec un fichier XML
    Par boleduch dans le forum ASP.NET
    Réponses: 3
    Dernier message: 24/10/2005, 18h13
  5. [VB.NET] Alimenter un dataset avec une chaine XML...
    Par David.V dans le forum ASP.NET
    Réponses: 3
    Dernier message: 25/05/2004, 09h09

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