Datagridview dans Chart

Résolu
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Statut
Membre
Dernière intervention
25 octobre 2014
- Modifié par le_pere_noel le 25/10/2014 à 01:35
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
- 24 août 2020 à 11:12
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 :)

5 réponses

Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
25 oct. 2014 à 10:12
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é?
0
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Statut
Membre
Dernière intervention
25 octobre 2014

Modifié par le_pere_noel le 25/10/2014 à 11:21
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
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
25 oct. 2014 à 11:57
Dans le code que je t'ai donné hier as tu vu
AffichePts.Rows[j][1].ToString
?
Non, c'était
AffichePts.Rows[j].Cells[1].Value

Auquel tu ajouteras ToString() pour en faire un string, ou que tu mettra dans ton concert pour avoir un int.

Comme tu remplis les données par une boucle il ne faut pas mettre
chart1.DataBind();
0
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Statut
Membre
Dernière intervention
25 octobre 2014

Modifié par le_pere_noel le 25/10/2014 à 12:03
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 :)
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
25 oct. 2014 à 12:55
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.
0
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Statut
Membre
Dernière intervention
25 octobre 2014

25 oct. 2014 à 13:54
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 :/
0
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Statut
Membre
Dernière intervention
25 octobre 2014

25 oct. 2014 à 13:58
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
0
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Statut
Membre
Dernière intervention
25 octobre 2014

Modifié par le_pere_noel le 25/10/2014 à 11:48
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]
:/
0
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Statut
Membre
Dernière intervention
25 octobre 2014

25 oct. 2014 à 12:59
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 ^^.
0

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

Posez votre question
le_pere_noel
Messages postés
17
Date d'inscription
jeudi 23 octobre 2014
Statut
Membre
Dernière intervention
25 octobre 2014

25 oct. 2014 à 14:53
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";
}
}
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
25 oct. 2014 à 16:20
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();
0
Mymoimeme > Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022

23 août 2020 à 22:58
Avec ce code j'essaie on m'affiche fichier introuvable au niveau de la ligne 5 disant que le fichier est introuvable avec l'entête de mon tableau inscrit dans le message d'erreur quelqu'un peu m'aider????
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596 > Mymoimeme
24 août 2020 à 11:12
oui quand tu penseras à dire bonjour et s'il vous plait. Comme je te l'ai déjà dit
0