Export datagridview/csv étrange

Messages postés
44
Date d'inscription
lundi 9 décembre 2013
Statut
Membre
Dernière intervention
29 décembre 2015
-
Bonjour,
j'ai réussi à construire un programme tableur qui me permet d'entrer des données et de les exportés en csv. Tout fonctionne, seulement suite à la sauvegarde des données, celles ci sont décalées...
Je ne comprends pas pourquoi.
Je vous met à disposition le code complet, y'a pas de winform tout est dans le code, juste un copié collé et ça fonctionne. Suffit de mettre un fichier nommé test.csv dans le C:/
Merci si quelqu'un veut bien m'aider, vous êtes mon dernier espoir ^^

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        DataGridView my_datagridview = new DataGridView();
        DataTable my_datatable = new DataTable();
        TextBox text_box_export = new TextBox();
        Button export_btn = new Button();



        public Form1()
        {
            InitializeComponent();
        }





        private void Form1_Load(object sender, EventArgs e)
        {
            this.Size = new Size(750, 450);
            my_datagridview.Size = new Size(600, 400);
            my_datagridview.Location = new Point(5, 5);


            export_btn.Size = new Size(100, 50);
            export_btn.Location = new Point(470, 5);
            export_btn.Text = "Export";

            string[] raw_text = System.IO.File.ReadAllLines("C:\\test.csv");
            string[] data_col = null;
            int x = 0;


            text_box_export.Size = new Size(350, 340);
            text_box_export.Location = new Point(470, 65);
            text_box_export.Multiline = true;


            
            export_btn.Click += new EventHandler(export_btn_Click);

            this.Controls.Add(export_btn);

            this.Controls.Add(text_box_export);


            foreach (string text_line in raw_text)
            {
                // MessageBox.Show(text_line);
                data_col = text_line.Split(',');
                if (x == 0)
                {
                    for (int i = 0; i <= data_col.Count() - 1; i++)
                    {
                        my_datatable.Columns.Add(data_col[i]);

                    }
                    x++;

                }
                else
                {
                    my_datatable.Rows.Add(data_col);

                }



            }
            my_datagridview.DataSource = my_datatable;

            this.Controls.Add(my_datagridview);
        }


        void export_btn_Click(object sender, EventArgs e)
        {


            int count_row = my_datagridview.RowCount;
            int count_cell = my_datagridview.Rows[0].Cells.Count;

            // MessageBox.Show(count_row.ToString());
            // MessageBox.Show(count_cell.ToString());


            for (int row_index = 0; row_index <= count_row - 2; row_index++)
            {


                for (int cell_index = 0; cell_index <= count_cell - 1; cell_index++)
                {

                   // MessageBox.Show(my_datagridview.Rows[row_index].Cells[cell_index].Value.ToString());
                    text_box_export.Text = text_box_export.Text + my_datagridview.Rows[row_index].Cells[cell_index].Value.ToString() + "";
                    



                }
                text_box_export.Text = text_box_export.Text + "\n";


            }
            System.IO.File.WriteAllText(@"c:\\test.csv", text_box_export.Text);
        }





    }
}


EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 

6 réponses

Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
68
0
Merci
bonsoir !
Tu t'es trompé de langage ! Tu as posté dans la section VB et ton code est du C#
Commenter la réponse de vb95
Messages postés
13847
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 octobre 2019
312
0
Merci
Bonjour,

Le mieux est de binder ton datagridview à une List<T>, T représentant une classe que tu auras écrit.
Dans cette classe, tu ajoutes une méthode de serialisation, qui retourne un string contenant une ligne complète, avec string.format ou string.split si tu as mis les variables internes de ta classe en tableau.

Ensuite, tu utilises File.WriteLine pour chaque item de la liste.

Pour le binding, un exemple ici:
http://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource
Commenter la réponse de Whismeril
Messages postés
44
Date d'inscription
lundi 9 décembre 2013
Statut
Membre
Dernière intervention
29 décembre 2015
0
Merci
vb95 : Désolé :(
Whismeril : J'ai été voir, mais ça va me faire modifier tout le projet en cours, y'a pas un autre moyen de résoudre le problème ? Ca vient des boucles for je pense ou du btn export mais je vois pas ou...

Regardez :

Ajout d'une ligne depuis le logiciel (et export des données) :


Ré-ouverture du csv après l'export :


Tout est décallé et une ligne à carrément été mangé.

Vous voyez d'ou est ce que ça pourrait venir ?

Merci :)
maxime rebh
Messages postés
44
Date d'inscription
lundi 9 décembre 2013
Statut
Membre
Dernière intervention
29 décembre 2015
-
Entre les deux j'avais aussi ajouté la ligne Max Lamenace 23
Commenter la réponse de maxime rebh
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
68
0
Merci
salut !
A tout hasard

 text_box_export.Text = text_box_export.Text + my_datagridview.Rows[row_index].Cells[cell_index].Value.ToString() + "";


A la fin de la ligne ce n'est pas "" qu'il doit y avoir mais "," : c'est à dire le caractère du Split

Pense à enlever le dernier caractère de Split à cette ligne ci
text_box_export.Text = text_box_export.Text + "\n";
devient

text_box_export.Text = text_box_export.Text.Substring(0,text_box_export.Text.Length - 1) + "\n";

Commenter la réponse de vb95
Messages postés
44
Date d'inscription
lundi 9 décembre 2013
Statut
Membre
Dernière intervention
29 décembre 2015
0
Merci
salut, merci de ta réponse !
déjà un problème résolu : les colonnes ne sont plus retirés.
Donc maintenant ça sauvegarde bien, mais il y a toujours la ligne du haut qui saute lors de la réouverture du fichier...
On y est presque :D
vb95
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
68 -
Salut
Je suis VBNettiste mais la ligne du haut dont tu parles c'est celle avec Nom, Prénom et Age ?
Si oui cela n'a rien à voir avec la sauvegarde ou la lecture du fichier mais avec l'initialisation des intitulés des colonnes de ton DataGridview
Normalement lorsque tu poses le Datagridview à la conception sur la Form et que tu vas dans les propriétés de ton DataGridview tu dois pouvoir initialiser tes colonnes avec la Collection Columns de cette dernière !
vb95
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
68 > vb95
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
-
PS
Il va de soit que cette fameuse ligne Nom, Prénom et Age ne doit pas être sauvegardée dans le fichier
vb95
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
68 > vb95
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
-
Autre chose : tes contrôles ont été ajoutés sur la Form de façon dynamique ( par code)
Ajoute les plutôt à la conception de la Form en les prenant dans la boite à outils et en les déposant sur la Form avec la souris ! Et initialise les propriétés de tes contrôles dans la fenêtre Propriétés !
On construit d'abord la Form avec ses contrôles et leurs propriétés
Ensuite on code les événements : clic sur un bouton, saisie dans une textbox, etc ....
Commenter la réponse de maxime rebh
Messages postés
13847
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 octobre 2019
312
0
Merci
Bonjour

y'a pas un autre moyen de résoudre le problème ?


Si bien sûr, comme VB95 l'a vu si tu n'exportes pas le séparateur, il n'y a pas de séparation.

Par contre, une classe perso évite les problèmes d'entête de colonne, puisque les colonne prennent le nom des propriétés de la classe...

Dans le code que tu nous a montré, les entêtes ne sont pas définies, soit elles le sont ailleurs, comme le pense VB, soit elles sont dans ton fichier d'origine, ce que je pense car tu as bindé un datatable et une fois bindé, on peut difficilement modifier la structure de la grille, sauf à utiliser un bindingsource.... Mais bon tu ne veux pas.

Enfin bref, si tu veux des entêtes, les exporter.


Pour éviter d'avoir une ligne vide à la fin parce qu'il y a \n en trop, il est plus simple d'écrire chaque ligne dans un tableau ou une liste et d'utiliser File.WriteAllLines

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Commenter la réponse de Whismeril