none
Werte von DataGridView in globales Array schreiben RRS feed

  • Frage

  • Hallo,

    ich komme an der folgenden Problemstellung einfach nicht weiter:

    Ich habe zwei Forms, Form1 und Form2. Von Form1 aus wird Form2 geöffnet, auf welchem sich ein DataGridView befindet, welcher mit Daten gefüllt wir. Nun möchte ich über einen Button auf Form2 die Daten in ein globales Array schreiben, und Form2 schließen. Danach sollen die Daten in Form1 weiterverarbeitet werden. Das DGV hat 4 Spalten und eine unterschiedliche Anzahl an Zeilen.

    Nun habe ich in Form1 das Array in einer Klasse definiert:

    Public Class global_var
        Public Shared oArray(,) As String
    End Class

    und versuche über eine Schleife in Form2 ins Array zu schreiben:

    For j As Integer = 0 To DGV.RowCount
                global_var.oArray(j, 0) = DGV.Rows(j).Cells(0).Value.ToString
                global_var.oArray(j, 1) = DGV.Rows(j).Cells(1).Value.ToString
                global_var.oArray(j, 2) = DGV.Rows(j).Cells(2).Value.ToString
    	    global_var.oArray(j, 3) = DGV.Rows(j).Cells(3).Value.ToString
                j += 1
    Next

    Ich bekomme allerdings den Fehler:

    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Wenn ich das Array mit festgelegter Größe definierte (z.B. oArray(100,4)), geht es.

    Das ist aber ungeschickt, da ich nicht mit "".Length die Größe des Arrays für die spätere Verarbeitung ermitteln kann.

    Kann mir jemand erklären, wo der Fehler liegt?

    Gruß, J. Schweigert


    Dienstag, 5. März 2013 20:32

Antworten

  • Hallo,bevor du mit deiner Schleife beginnst musst du dein Array mit New erstellen. Die Anzahl bekommst du ja über DGV.RowCount.

    global_var.oArray = New String(DGV.RowCount, 4) {}
    PS: die Zeile j+=1 in der Schleife solltest du dir sparen, da pro Schleifendurchgang, j automatisch um je 1 erhöht wird. Wenn du nur jedes 2. Item in deinem Array haben möchtest, kannst du Step angeben.
    For j As Integer = 0 To DGV.RowCount Step 2



    Koopakiller [kuːpakɪllɐ] | Webseite | Code Beispiele | Facebook | Snippets

    Dienstag, 5. März 2013 20:47
    Moderator

Alle Antworten

  • Hallo,bevor du mit deiner Schleife beginnst musst du dein Array mit New erstellen. Die Anzahl bekommst du ja über DGV.RowCount.

    global_var.oArray = New String(DGV.RowCount, 4) {}
    PS: die Zeile j+=1 in der Schleife solltest du dir sparen, da pro Schleifendurchgang, j automatisch um je 1 erhöht wird. Wenn du nur jedes 2. Item in deinem Array haben möchtest, kannst du Step angeben.
    For j As Integer = 0 To DGV.RowCount Step 2



    Koopakiller [kuːpakɪllɐ] | Webseite | Code Beispiele | Facebook | Snippets

    Dienstag, 5. März 2013 20:47
    Moderator
  • Vielen Dank, das war der fehlende Schritt!

    Habe es jetzt übrigens mit einer For Each...-Schleife gelöst, ist in meinen Augen sauberer. Danke auch für den Tip mit "Step 2" !

    Dienstag, 5. März 2013 21:08
  • Hi,
    VB bietet die (uralte) Redim-Anweisung. Mit “Dim oArray(,) As String” deklarierst Du lediglich die Variable oArray, die ins Leere (Nothing) verweist. Mit “Redim oArray(DGV.RowCount – 1, 3)” reservierst Du den Speicherplatz, auf den dann die Variable oArray verweist. Um für zukünftige Änderungen variabel zu sein, könnte dann die Schleife so aussehen:
     
    Redim oArray(DGV.RowCount – 1, DGV.ColumnCount – 1)
    For i = 0 To oArray.GetUpperBound(0)
      For j = 0 To oArray.GetupperBound(1)
        global_var.oArray(i, j) = DGV.Rows(i).Cells/j).Value.ToString
      Next
    Next
     
    --
    Peter Fleischer
    Mittwoch, 6. März 2013 05:24