Benutzer mit den meisten Antworten
C# Befüllung eines zweidimmensionalen Arrays

Frage
-
hallo zusammen,
ich möchte eine schöne Darstellung einer excel Tabelle erstellen, bekomme die Daten aber nicht in ein Array hinterlegt.
public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // Datei öffnen if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { // DataTable hält die gesplitteten CSV-Daten //DataTable dt = new DataTable(); String[,] dt = new String[,] { }; // Datei öffnen, hier als UTF8 using (StreamReader sr = new StreamReader(openFileDialog1.FileName, Encoding.UTF8)) { int j,i,zeile = 0; // bis Dateiende lesen while (!sr.EndOfStream) { // Zeile einlesen und anhand des Trennzeichens ";" in einzelne Spalten (stringarray) splittenString[] currentline = null; currentline = sr.ReadLine().Split(new String[] { ";" }, StringSplitOptions.None); MessageBox.Show(currentline[3]); for (zeile = 0; zeile == 7; zeile++) { for (int spalte = 0; spalte == currentline.Length; spalte++) { /*???*/ /*???*/ /*???*/ dt[currentline[spalte],zeile]; /*???*/ /*???*/ /*???*/ } } // wenn neue Tabelle (noch keine Spalten enthalten) } // Stream schließen sr.Close(); } // DataTable an das Gitter auf der Oberfläche übergeben und somit anzeigen dataGridView1.DataSource = dt; } } } }
wie ist es möglich dieses Array zu befüllen?
Die Fehlermeldung lautet:
1.
Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler CS0029 Der Typ "string" kann nicht implizit in "int" konvertiert werden.2.
Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler CS0201 Nur assignment-, call-, increment-, decrement- und new object-Ausdrücke können als Anweisung verwendet werden.
DANKE in Vorraus
- Verschoben Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 14. Juli 2017 11:07 Die Frage ist nicht auf die Express-Edition beschränkt (aus: Visual Studio Express Editionen)
Antworten
Alle Antworten
-
Hi Bernd,
der erste Fehler hat seine Ursache in der nicht typgerechten Zuweisung:die Variable currentLine ist ein Array vom Typ String. Erwartet (bzw. erforderlich) ist aber beim Index von dt ein Integer. Da musst Du den Typ konvertieren, z.B. so:
dt[Convert.ToInt32(currentline[spalte]), ...
Der zweite Fehler liegt am Aufruf:
Methode ist mit runden Klammern aufzurufen, Eigenschaft ohne runde Klammern. Bei Eigenschaften ist eine Zuweisung erforderlich (= : Gleichheitszeichen), z.B. so:
dt[Convert.ToInt32(currentline[spalte]), zeile] = currentline[spalte + 1];
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort vorgeschlagen Peter Fleischer Montag, 3. Juli 2017 14:12
- Bearbeitet Peter Fleischer Dienstag, 4. Juli 2017 05:40
-
Danke! Das hätte ich bestimmt bis zum jüngten Gericht probiert.
ABER:
Warum komme ich nicht in die FOR-Schleifen hinein um die Zeilen/Spalten in ein Array zu schmeißen??
Bsp.: "Lampen1";"Lampen2";"Lampen3";"Lampen4" <== 4 Spalten, 3 Zeilen (Platzhalter 7)
13;12;1;5
1;10;4;3
...
private void button1_Click(object sender, EventArgs e) { /* String folder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "test1"); System.Diagnostics.Process.Start("Explorer", @"P:\"); // öffen eines Pfades FileAccess.Read(folder); */ // Datei öffnen if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { // DataTable hält die gesplitteten CSV-Daten //DataTable dt = new DataTable(); String[,] dt = new String[,] { }; // Datei öffnen, hier als UTF8 using (StreamReader sr = new StreamReader(openFileDialog1.FileName, Encoding.UTF8)) { for (int j=0; j==7; j++) // bis Dateiende lesen { while (!sr.EndOfStream) { // Zeile einlesen und anhand des Trennzeichens ";" in einzelne Spalten (stringarray) splitten String[] currentline = sr.ReadLine().Split(new String[] { ";" }, StringSplitOptions.None); for (int i=0; i <= currentline.Length; i++) dt[i, j] = currentline[i]; } } // Stream schließen sr.Close(); } // DataTable an das Gitter auf der Oberfläche übergeben und somit anzeigen dataGridView1.DataSource = dt; } }
Aufbau von außen nach innen sollte eigentlich gehen?
Ich sehe schon wieder den walt vor lauter Bäumen nicht
DANKE
- Bearbeitet BERND121 Mittwoch, 5. Juli 2017 13:48 Anpassung
-
Hi Bernd,
in Deinem Programm gibt es mehrere Probleme.Unklar ist, warum Du ein zweidimensionales Array nutzt.
Die Schleife for (int j=0; j==7; j++) wird nicht durchlaufen, da j zum Start auf 0 gesetzt wird und die Schleife nur abgearbeitet wird, wenn j == 7 ist. Das ist natürlich nicht der Fall.
Dein zweidimensionales Array wird nirgendwo dimensioniert und ist deshalb immer leer.
Die Nutzung eines Arrays als Datenquelle eines DataGridView ist nicht vorgesehen.
Im nachfolgenden Code demonstriere ich, wie ein zweidimensionales Array erzeugt und gefüllt werden kann. Um dann den Inhalt in einem DataGridView anzuzeigen, nutze ich den virtuellen Modus.
using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form05 : Form { public Form05() { InitializeComponent(); } DataGridView dataGridView1 = new DataGridView() { Dock = DockStyle.Fill, VirtualMode = true, AllowUserToAddRows = false }; Button btn = new Button() { Text = "Laden", Dock = DockStyle.Top }; String[,] dt; private void Form05_Load(object sender, EventArgs e) { this.Controls.AddRange(new Control[] { dataGridView1, btn }); btn.Click += button1_Click; dataGridView1.CellValueNeeded += DataGridView1_CellValueNeeded; } private void button1_Click(object sender, EventArgs e) { { OpenFileDialog openFileDialog1 = new OpenFileDialog() { InitialDirectory = Environment.CurrentDirectory }; if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { List<string[]> buffer = new List<string[]>(); using (StreamReader sr = new StreamReader(openFileDialog1.FileName, Encoding.UTF8)) while (!sr.EndOfStream) buffer.Add(sr.ReadLine().Split(new String[] { ";" }, StringSplitOptions.None)); dt = new String[buffer.Count, 3]; for (int i = 0; i < buffer.Count; i++) for (int j = 0; j < 3; j++) dt[i, j] = buffer[i][j]; dataGridView1.ColumnCount = 3; dataGridView1.RowCount = buffer.Count; } } } private void DataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) => e.Value = dt[e.RowIndex, e.ColumnIndex]; } }
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 14. Juli 2017 11:08
-
Das gefällt mir ja schon mal sehr gut wie das aussieht.
Es wird jetzt das buffer.add... verwendet. Dabei ergibt sich innerhalb die Struktur :
NAME WERT
>buffer
>[0] {sring[3]}
>[0] {"hallo"}
>[1] {"du"}
>[2] {"!"}
>[1] {string[3]}
>[0] {"A"}
>[1] {"B"}
...
...so wie ich mir das eigentlich gedacht hab mit dem 2-Dim. Array.
Aber wie verflixt kann ich die Werte ausgeben?
Ich komm leider nicht auf den richtigen Trichter.
Danke!
- Bearbeitet BERND121 Freitag, 14. Juli 2017 06:55
-
Hi Bernd,
wie meinst Du das "Aber wie verflixt kann ich die Werte ausgeben?"In meinem Beispiel werden die eingelesenen Daten in einem DataGridView angezeigt.
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks