none
C# Befüllung eines zweidimmensionalen Arrays RRS feed

  • 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

    Montag, 3. Juli 2017 13:18

Antworten

  • ich habe es umgeschmissen und bin anders dran gegangen.

    aber ich muss mich für eure Intension bedanken!

    :-)

    • Als Antwort markiert BERND121 Freitag, 21. Juli 2017 05:18
    Freitag, 14. Juli 2017 10:35

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


    Montag, 3. Juli 2017 14:06
  • 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
    Mittwoch, 5. Juli 2017 11:55
  • 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

    Donnerstag, 6. Juli 2017 05:15
  • 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
    Freitag, 14. Juli 2017 06:50
  • 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

    Freitag, 14. Juli 2017 10:02
  • ich habe es umgeschmissen und bin anders dran gegangen.

    aber ich muss mich für eure Intension bedanken!

    :-)

    • Als Antwort markiert BERND121 Freitag, 21. Juli 2017 05:18
    Freitag, 14. Juli 2017 10:35