maxime rebh
Messages postés43Date d'inscriptionlundi 9 décembre 2013StatutMembreDernière intervention29 décembre 2015
-
Modifié par NHenry le 29/12/2015 à 15:36
Whismeril
Messages postés19027Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention24 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
Whismeril
Messages postés19027Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention24 avril 2024656 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.
maxime rebh
Messages postés43Date d'inscriptionlundi 9 décembre 2013StatutMembreDernière intervention29 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 :)
maxime rebh
Messages postés43Date d'inscriptionlundi 9 décembre 2013StatutMembreDernière intervention29 décembre 2015 29 déc. 2015 à 11:28
Entre les deux j'avais aussi ajouté la ligne Max Lamenace 23
maxime rebh
Messages postés43Date d'inscriptionlundi 9 décembre 2013StatutMembreDernière intervention29 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
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 avril 2024169 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 !
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 avril 2024169
>
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 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
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 avril 2024169
>
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 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 ....
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