Wie kann ich eine ganze Spalte von einer DataGridView auslesen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Narretei.

    Wie kann ich eine ganze Spalte von einer DataGridView auslesen

    Hallo :D :D :D

    Info: Visual Studio 2017

    Ich habe mehrere MS Access Datenbanken ausgelesen und deren Inhalte in eine DataGridView abgespeichert. Die DatagridView verfügt dabei über 6 Spalten.
    Nun möchte ich eine bestimmte Spalte mit allen Zeilen auslesen und in einer anderen DataGridView (oder Listbox, oder etc., was halt am Besten ist ;) ) abspeichern.
    Allerdings komme ich damit nicht weiter. Kann da jemand helfen?

    Dankeschön :)

    LizardProgrammer schrieb:

    ch habe mehrere MS Access Datenbanken ausgelesen und deren Inhalte in eine DataGridView abgespeichert
    Ich würde gerne wissen wie bei dir dieser Weg von Datenbank nach DataGridView Implementiert ist.

    Im Besten fall liegt zwischen deinem DGV und der DB ein Typisiertes DataSet, mit den ganzen verschiedenen DataTables die deine Datenbank abbilden. Da könnte man einfach eine ListView oder sowas an die bereits bestehende, und im DGV bereits angezeigte, DataTable anbinden, und via DataMember nur auf deine gewünschte Spalte reduzieren. (ListView hat das nicht)

    Im Schlimmsten Fall hast du eine eigene Lösung via DataReader und ein lediglich lokal aufgebautes und nach der Befüllung der DGV verworfenes Objekt, sodass es nun ein ziemlicher Krampf wird, an diese Daten ranzukommen, und für ein anderes GUI Element aufzubereiten.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „EaranMaleasi“ ()

    EaranMaleasi schrieb:

    Uhm. Könntest du das bitte mal per Code zeigen?


    Beantworte doch mal diese Frage, dann kann man dir sicher weiterhelfen.

    Eigentlich hat @EaranMaleasi Dir schon eine Möglichkeit aufgezeigt. Stichwort Typisiertes DataSet.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Zu Fuß kommt man so (ungetestet aus dem Kopf) an den Inhalt der Spalten:

    Dim lstSpaltenInhalte As List(Of String)

    for rach row as DataRow in DataTable.Rows
    lstSpaltenInhalte.Add(row(NameSpalte).toString())
    next

    Mich täte aber auch interessieren warum man da die Daten von A nach B verwurstet...
    p.s. Code ist nicht Cop&Paste geeignet sondern soll lediglich das Vorgehen verdeutlichen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Du willst aus dem DataGridView lesen, wenn ich's richtig verstehe?
    So etwa könnt's auch gehen:

    Dim i As Integer
    Dim Anzahlrows As Long

    Anzahlrows = DatagridView1.RowCount

    Dim Spaltentext(Anzahlrows) as string

    '// Aus dem DataGridView lesen:
    '// Liest Spalte 5 (ggf. den Wert ändern) Jeder Reihe ins Array "Spaltentext"
    For i = 0 to Anzahlrows
    Spaltentext(i) = DatagridView1.Rows(i).cells(5).value.ToString
    next i

    Danach könnte man das Array (von 0 bis Anzahlrows) in
    ein anderes Ziel schreiben.
    Könnte man aber auch in der Schleife direkt machen...
    es gibt zig Möglichkeiten..
    Hallo :) Vielen Danke erstmal für die ganzen Antworten.
    Ich hab mittlerweile einiges ausprobiert, allerdings nur mit mäßgigem Erfolg.

    VB.NET-Quellcode

    1. Dim CellRowIndex As Integer = 2 'Zeile 1 ist mit Spaltenüberschriften gefüllt
    2. Dim CellColumnIndex As Integer = 1
    3. For i As Integer = 0 To dgv.Rows.Count - 2
    4. excel_split.Cells(CellRowIndex, CellColumnIndex) = dgv.Rows(i).SetValues.ToString()
    5. Next


    Bei "excel_split" handelt es sich um eine einfach excel mappe :)

    Kann mir jemand einen Tipp geben was hier nicht passt? Habe ich vielleicht einen logischen Fehler irgendwo?

    Danke :)
    1. Du schreibst immer in Zelle (2;1). Du zählst die Indexe der zwei Integer in der Schleife nicht hoch.

    ​2. du fragst die ganze Zeile rows(i) ab, nicht eine einzelne Zelle davon, sondern die ganze Reihe.

    3. Du benutzt setvalues, was eine Funktion ist und immer nur nen Boolean zurückgibt ( ich musste gerade sogar gucken was das überhaupt tut). Die Funktion ist zum SETZEN von Werten, nicht zum bekommen.

    ​4. Daten aus einer Oberfläche zu kratzen ist unglaublich schlechte Praxis und wird dir später auf die Füße Fallen. Mit ​dgvZyklisch.Rows(i).DataBoundItem bekommst du das Objekt, was einer dDtagridview-Reihe zu Grunde liegt. Mit nem Cast könntest du dann das ganze in was auch immer du hast umwandeln und das dann wiederum an ein anderes Element binden. Oder so.

    ​5. Vermutlich hast du ​Option Strict On nicht an.
    @Narretei Danke für dein Feedback :D Das SetValues war ein Fehler der sich durch den Tab eingeschlichen hat. Sollte eigentlich nur Values heißen.
    Ich habe mein Programm nun ergänzt und kann mit meinem Quellcode eine Spalte (hier Spalte 6 bzw. 5 weil von 0 los gezählt wird ;) ) in Excel ausgeben lassen.
    Ich weiß es ist alles etwas umständlich aber ich will viele verschiedene Sachen in VB.NET ausprobieren und schauen was möglich ist.

    Also nohcmals vielen Dank an alle für die Beiträge und die Hilfe. :)

    Ich hab hier mal den Quellcode nochmal für diejenigen, die vielleicht mal auf das selbe Problem stoßen:

    VB.NET-Quellcode

    1. Dim CellRowIndex As Integer = 2
    2. Dim CellColumnIndex As Integer = 1
    3. For i As Integer = 0 To dgv.Rows.Count - 2
    4. excel_split.Cells(CellRowIndex, CellColumnIndex) = dgv.Rows(i).Cells(5).Value.ToString()
    5. CellRowIndex += 1
    6. Next
    7. excel_split.Columns.AutoFit()
    8. excel_split.Visible = True