Datagridview dans Chart [Résolu]

Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Dernière intervention
25 octobre 2014
-
Bonjour,
me revoila avec mes questions de base :/

donc après avoir intégré la datagridview dans mon soft j'essaye maintenant de mettre ça dans un chart.

Avec le code qui suit

for (int i = 0; i < AffichePts.ColumnCount-1; i++)
                {
                    chart1.DataSource = AffichePts;
                    chart1.Series.Add("Ma série");
                    chart1.Series[i].IsXValueIndexed = true;
                    chart1.Series[i].Name = "courbe - " + (i + 1);
                    chart1.Series[i].XValueMember = AffichePts.Columns[1].ToString();
                    chart1.Series[i].YValueMembers = AffichePts.Columns[i+1].ToString();
                    chart1.Series[i].Points.AddXY(Convert.ToDouble(AffichePts.Columns[1].ToString()), Convert.ToDouble(AffichePts.Columns[i + 1].ToString()));
                    chart1.Series[i].ChartType = SeriesChartType.Spline;
                    chart1.DataBind();
                }
                chart1.Update();


malheureusement ca ne trace rien à la fin :/
J'ai soit un graphique vide soit un format de la chaine d'entré incorrect
Je pense que mon soucis vient du fait que je n'ajoute pas les lignes mais si je mets

AffichePts.Rows[j][i].ToString()

j'ai une erreur impossible d'appliquer une indexation a un datagridviewRow

Merci d'avance pour l'aide :)
Afficher la suite 

Votre réponse

5 réponses

Messages postés
12362
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
Bonjour
                    chart1.Series[i].Points.AddXY(Convert.ToDouble(AffichePts.Columns[1].ToString()), Convert.ToDouble(AffichePts.Columns[i + 1].ToString()));

Je ne pense pas que ceci fonctionne.
AffichePts.Columns[i + 1] c'est l'objet colonne et pas les cellules qu'elle contient et encore moins les valeurs de ces cellules.

Il te faut soit ajouter un à un les points (attention, la valeurs Y prend un tableau entrée pas une valeurs unique) soit binder une collection (et c'est là que Yvaluemeber et Xvaluemenber sont utiles). D'apres mon expérience l'ajout un par un s'exécute plus vite que le binding.
D'aileurs tu doit pouvoir charger ton chart dans la même boucle que ton datagridview.

As tu regardé le tuto dont je t'ai parlé?
Commenter la réponse de Whismeril
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Dernière intervention
25 octobre 2014
0
Merci
je me doute que colum ne renvoie pas la bonne valeur je voulais partir la dessus :

for (int i = 0; i < AffichePts.ColumnCount-1; i++)
                {
                    chart1.DataSource = AffichePts;
                    chart1.Series.Add("Ma série");
                    chart1.Series[i].IsXValueIndexed = true;
                    chart1.Series[i].Name = "courbe - " + (i + 1);
                    for (int j = 0; j < AffichePts.RowCount - 1; j++)
                    {
                        chart1.Series[i].Points.AddXY(Convert.ToInt32(AffichePts.Rows[j][1].ToString()), Convert.ToInt32(AffichePts.Rows[j][i + 1].ToString()));
                    }
                    chart1.Series[i].ChartType = SeriesChartType.Spline;
                    chart1.DataBind();
                }
                chart1.Update();


mais j'ai une erreur sur le
AffichePts.Rows[j][1]
impossible d'appliquer une indexation a un datagridviewRow

J'ai bien lu ton tuto je vais regarder de nouveau ce que j'ai raté :p
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Dernière intervention
25 octobre 2014
-
j'ai pas vu passé ce code je vais essayer de voir ça mais je ne comprends pas comment je choisi ma colonne avec ton code. La j'affiche toute ma ligne alors que moi chaque colonne est un Y différent

mais merci je vais fouiller :)
Whismeril
Messages postés
12362
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
-
C'était avant hier et pas hier
http://codes-sources.commentcamarche.net/forum/affich-10038089-import-fichier-txt-multiple-dans-datagridviexw#8.

Dans chaque ligne il y a une collections de cellules. Comme ton exemple prenait la colonne 1 j'ai mis 1 mais tu peux mettre j.
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Dernière intervention
25 octobre 2014
-
j'ai bien compris sauf que si je me trompe pas tu construis une serie avec les valeurs d'une ligne alors que moi je veux faire une série avec la valeur d'une colonne

donc même si j'arrivais à faire fonctionner ça
chart1.Series[i].Points.AddXY(Convert.ToInt32(AffichePts.Rows[j].Cells[0].Value.ToString()), Convert.ToInt32(AffichePts.Rows[j].Cells[0].ToString()));

le problème resterait que ca me mettrait la valeur de chaque ligne dans une nouvelle série alors que moi c'est chaque ligne d'une colonne :/
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Dernière intervention
25 octobre 2014
-
le format de mon fichier ressemble à ça maintenant :
1 12.233 15.1256
2 12.525 5.45
3 45 5

première colonne mes abscisses et toutes les autres colonnes sont mes ordonnées
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Dernière intervention
25 octobre 2014
-
ok j'ai résolu le problème avec ca
AffichePts.Rows[j].Cells[0].Value


maitenant je pense que le tracé n'est pas celui que j'attends puisqu'il prend ligne par ligne et non pas colonne par colonne :). Reste a voir si je peux integrer ca dans ton premier code :)
Commenter la réponse de le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Dernière intervention
25 octobre 2014
0
Merci
je suis reparti de 0 sur ce chart mais même soucis

ChartArea ChartArea1 = new ChartArea();

            // Ajouter le  Chart Area à la Collection ChartAreas du  Chart
            chart1.ChartAreas.Add(ChartArea1);

            // Créer deux  data series (qui contiendront les DataPoint)
            Series s1 = new Series();
            Series s2 = new Series();
            
            
             for (int j = 0; j < AffichePts.RowCount - 1; j++)
             {
               s1.Points.AddXY(Convert.ToInt32(AffichePts.Rows[j][1].ToString()), Convert.ToInt32(AffichePts.Rows[j][2].ToString()));
             }


j'ai une erreur de
AffichePts.Rows[j][1]
:/
Commenter la réponse de le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Dernière intervention
25 octobre 2014
0
Merci
mon dernier code

for (int i = 0; i < AffichePts.ColumnCount - 1; i++)//on ajoute autant de séries que necessaire
{
chart1.Series.Add(new Series());
chart1.Series[i].ChartType = SeriesChartType.Spline;
for (int j = 0; j < AffichePts.RowCount - 1; j++)
{
chart1.Series[i].Points.AddXY(Convert.ToInt32(AffichePts.Rows[j].Cells[0].Value.ToString()), Convert.ToInt32(AffichePts.Rows[j].Cells[0].ToString()));
chart1.Series[i].ChartArea = "ChartArea1";
}
}


probleme de format de chaine de caractère maitnenant ^^.
Commenter la réponse de le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Dernière intervention
25 octobre 2014
0
Merci
Bon j'ai dit de la merde ca marche parfaitement faut juste que je réfléchisse plus :D

Encore mille fois merci :)

pour info mon code au cas ou

for (int i = 0; i < AffichePts.ColumnCount - 1; i++)//on ajoute autant de séries que necessaire
{
chart1.Series.Add(new Series());
chart1.Series[i].ChartType = SeriesChartType.Spline;
chart1.Series[i].Name = "Courbe - " + (i+1);
for (int j = 0; j < AffichePts.RowCount - 1; j++)
{
chart1.Series[i].Points.AddXY(AffichePts.Rows[j].Cells[0].Value, AffichePts.Rows[j].Cells[i+1].Value);
chart1.Series[i].ChartArea = "ChartArea1";
}
}
Whismeril
Messages postés
12362
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
-
En intégrant ça dans le premier code ça donne un truc comme ça
            string path = Application.StartupPath + @"\test";
            string[] txtFiles = Directory.GetFiles(path);//répère le nom des fichier dans le répertoire

            List<string[]> fichiers = new List<string[]>(); //parce qu'avec .Add c'est lus simple que de set trainer un index

            foreach(string chemin in txtFiles)
                fichiers.Add(File.ReadAllLines(chemin));//File.ReadAllLines retourne directement un tableau de string contenant chaque lignes

            chart1.Series.Clear();
            for (int i = 0; i < fichiers.Count; i++)//on ajoute autant de colonnes que necessaire, pareil pour les séries
            {
                dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
                if (i > 0)//la première colone sert de X donc elle ne fait pas l'objet d'une série
                {
                    Series s = chart1.Series.Add("Série " + i);
                    s.IsXValueIndexed = true;
                    s.ChartType = SeriesChartType.Line;
                }
            }
            
            for(int i = 0; i < fichiers[0].Length;i++)//Puisque tous les fichiers ont le même nombre de lignes, je prend la longueur du premier tableau en référence
            {
                DataGridViewRow row = dataGridView1.Rows[dataGridView1.Rows.Add()];//ajoute une ligne 
                double x = Convert.ToDouble(fichiers[0][i], System.Globalization.CultureInfo.InvariantCulture);//je mets Invariant culture pour te prémunir d'un fichir avec des points comme séparateur de décimale si ton système est en virugule, ça ne marche pas dans l'autre sens

                for (int j = 0; j < fichiers.Count; j++)
                {
                    row.Cells[j].Value = fichiers[j][i];//remplit les cellules
                    if (j > 0) chart1.Series[j - 1].Points.AddXY(x, Convert.ToDouble(fichiers[j][i], System.Globalization.CultureInfo.InvariantCulture));//remplit les séries
                }
            }

            chart1.ChartAreas[0].RecalculateAxesScale();
Commenter la réponse de le_pere_noel

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.