Export datagridview/csv étrange

maxime rebh Messages postés 43 Date d'inscription lundi 9 décembre 2013 Statut Membre Dernière intervention 29 décembre 2015 - Modifié par NHenry le 29/12/2015 à 15:36
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 - 30 déc. 2015 à 08:15
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.

6 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
29 déc. 2015 à 00:39
bonsoir !
Tu t'es trompé de langage ! Tu as posté dans la section VB et ton code est du C#
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
29 déc. 2015 à 09:32
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
0
maxime rebh Messages postés 43 Date d'inscription lundi 9 décembre 2013 Statut Membre Dernière intervention 29 décembre 2015
29 déc. 2015 à 11:28
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 :)
0
maxime rebh Messages postés 43 Date d'inscription lundi 9 décembre 2013 Statut Membre Dernière intervention 29 décembre 2015
29 déc. 2015 à 11:28
Entre les deux j'avais aussi ajouté la ligne Max Lamenace 23
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
29 déc. 2015 à 13:08
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";

0

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

Posez votre question
maxime rebh Messages postés 43 Date d'inscription lundi 9 décembre 2013 Statut Membre Dernière intervention 29 décembre 2015
29 déc. 2015 à 23:33
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
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
30 déc. 2015 à 02:57
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 !
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
30 déc. 2015 à 03:21
PS
Il va de soit que cette fameuse ligne Nom, Prénom et Age ne doit pas être sauvegardée dans le fichier
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
30 déc. 2015 à 03:28
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 ....
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
Modifié par Whismeril le 30/12/2015 à 08:16
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
0
Rejoignez-nous