Laden...

DataGridView Export vor dem Exportieren nochmal bearbeiten

Erstellt von Rebbob vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.007 Views
R
Rebbob Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren
DataGridView Export vor dem Exportieren nochmal bearbeiten

Hallo Community,

ich hoffe jemand kann mir weiterhelfen.

Kurze Erläuterung:

Kleine Exporttool welches auf verschiedenen Datenbanken verbindet und einen Query ausführt.
Der Query wird als Kontrolle nochmal in ein DataGridView geschrieben.
Wenn die Daten im DGV korrekt sind besteht die Option das DGV zu exportieren.

Bei dem Export sollen allerdings einige Sachen beachtet werden, die ich leider Gottes nicht hinbekomme.

Beispiel:

Kunde kauft im Shop 3 Artikel.
Die Artikel werden im DataGridview wie folgt dargestellt:

Auftragsnummer Artikel Anzahl
1001 Puppe 3
1001 Feuerzeug 10
1001 Löffel 11

Im Export soll es allerdings anders ausgebeben werden.
10001;;Puppe;;3;;Feuerzeug;;10;;Löffel;;11;

DataGridView DGV = dataGridView1;
            string filename = "";
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "TXT (*.txt)|*.txt";
            sfd.FileName = "Export.txt";
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                if (File.Exists(filename))
                {
                    try
                    {
                        File.Delete(filename);
                    }
                    catch (IOException ex)
                    {
                        MessageBox.Show("Es war nicht möglich die Datei zu speichern." + ex.Message);
                    }
                }
                int columnCount = DGV.ColumnCount;
                string columnNames = "";
                string[] output = new string[DGV.RowCount + 1];
                for (int i = 0; i < columnCount; i++)
                {
                    columnNames += DGV.Columns[i].Name.ToString() + ";";
                }
                output[0] += columnNames;
                for (int i = 1; (i - 1) < DGV.RowCount; i++)
                {
                    for (int j = 0; j < columnCount; j++)
                    {
                        output[i] += DGV.Rows[i - 1].Cells[j].Value.ToString() + ";";
                    }
                }
                System.IO.File.WriteAllLines(sfd.FileName, output, System.Text.Encoding.UTF8);
                MessageBox.Show("Der Export wurde erfolgreich generiert.");

Ich bin für jede Art von Hilfe dankbar.

Gruß Bob

D
985 Beiträge seit 2014
vor 6 Jahren

Dafür nimmt man z.B. filehelpers.net, erstellt sich eine Klasse für den Export, die exakt die Struktur der CSV-Datei wiederspiegelt, befüllt eine Liste mit Instanzen dieser Klasse und schiebt diese durch die Filehelper-Engine.

Woher du deine Daten zum Befüllen der Instanzen bekommst ist dabei unerheblich - und das ist auch gut so.

16.806 Beiträge seit 2008
vor 6 Jahren

Und bissle auf den eigenen Code achten, was er macht:
try { File.**Delete**(filename); } catch (IOException ex) { MessageBox.Show(&quot;Es war nicht möglich die Datei zu **speichern**.&quot; + ex.Message); }

Und da das hier etwas nach Spaghetti-Code aussieht: [Artikel] Drei-Schichten-Architektur

T
50 Beiträge seit 2014
vor 6 Jahren


            TextWriter sw = new StreamWriter(@"D:\Planet_AS5\Images\Export.txt");

            int rowcount = SQL_dataGridView.RowCount;
            int colcount = SQL_dataGridView.ColumnCount;
            for (int i = 0; i < rowcount; i++)
            {
                for (int i2 = 0; i2 < colcount; i2++)
                {

                    sw.Write(string.Format("{0};", SQL_dataGridView[i2, i].Value.ToString()));
                }
               // sw.Write("\n");
            }
            sw.Close();

ist das nicht das was es soll??
bei mir funktioniert da seit jahren so..

edit: format der ersten Zahl übersehen...

D
985 Beiträge seit 2014
vor 6 Jahren

Wenn die Anforderung lauten würde: "Exportiere den Inhalt vom DataGridView so wie er ist" und man zu 100% ausschließen kann, dass in den Feld-Inhalten kein ",; oder Zeilenumbruch vorkommt und mit der zusätzlichen (überflüssigen) Spalte am Ende jeder Zeile (eigentlich fehlt bei dir der Zeilenumbruch) klar kommt, dann wäre das eine Option (die er aber auch schon hat).

Die Anforderung ist aber anders.

R
Rebbob Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren

Dafür nimmt man z.B.
>
, erstellt sich eine Klasse für den Export, die exakt die Struktur der CSV-Datei wiederspiegelt, befüllt eine Liste mit Instanzen dieser Klasse und schiebt diese durch die Filehelper-Engine.

Woher du deine Daten zum Befüllen der Instanzen bekommst ist dabei unerheblich - und das ist auch gut so.

Vielen Dank erstmal für die schnelle Antwort.

So wie ich es verstanden habe ist FilerHelpers eine Engine die anhand vom Mapping die Daten anders darstellt.
Trotzdem wird ja noch ein Schleifenkonstrukt gebraucht um das Ergebniss zu erzielen.

Genau dieses "Konstrukt" ist der Knackpunkt.

Ich versuche es nochmal Detailierter zu erklären:

Kunde Max Musster bestellt 3 verschiedene Artikel.
Die verschiedenen Artikel werden im DataGridView so untereinander geschrieben.

;;1;3;65;Q;;Datum;EUR;;;K;;;;mr;Mustermann Max;;20004;Mustermannstraße 1;12345;Stadt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Artikel 1;;Artikelanzahl;
;;1;3;65;Q;;Datum;EUR;;;K;;;;mr;Mustermann Max;;20004;Mustermannstraße 1;12345;Stadt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Artikel 2;;Artikelanzahl;
;;1;3;65;Q;;Datum;EUR;;;K;;;;mr;Mustermann Max;;20004;Mustermannstraße 1;12345;Stadt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Artikel 3;;Artikelanzahl;

Allerdings soll anhand der selben Auftragsnummer "20004" alle zusammen in einer Zeile zusammengefasst werden.
Das soll natürlich für alle anderen Auftragsnummer "20005/20006" usw passieren.

;;1;3;65;Q;;Datum;EUR;;;K;;;;mr;Mustermann Max;;20004;Mustermannstraße 1;12345;Stadt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Artikel 1;;Artikelanzahl;Artikel 2;;Artikelanzahl;Artikel 3;;Artikelanzahl;

Die jetztige Exportfunktion funktioniert für die 1:1 Darstellung von einem DataGridView, hilft mir allerdings nicht für das was ich brauche.

Ich komme nich dahinter, wie die Schleife(n) so gebaut werden müssen, dass die Bedinungen dahinter greifen.
FileHelpers ist mit Sicherheit eine schöne Sache um Daten zu mappen, allerdings ist wie gesagt die "Logik" das schwere.

Ich bin für jede Hilfe dankbar 😃

T
314 Beiträge seit 2013
vor 6 Jahren

Nun du musst also

  1. deine Daten sammeln
  2. nach der Auftragsnummer gruppieren
  3. die Daten jeder Gruppe ausgeben
  4. zwischen jeder Gruppe einen Zeilenumbruch erzeugen
R
Rebbob Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren

Das Problem wurde gelöst.
Vielen Dank für die Hilfe.

Ein Schreibtischtest hat sich als sehr hilfreich entpuppt.
Konnte anhand dessen die "komplexere" Schleife bauen und vergleiche
verschiedene DataGridView Cells miteinander.

😁 👍