Zeile aus einem Datagridview in ein anderes Datagridview übergeben

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von sirblacksoul.

    Zeile aus einem Datagridview in ein anderes Datagridview übergeben

    Hallo,

    Ich habe ein kleines Problem mit meinem Datagridview.
    Ich habe in mein DatagGridView1 eine CSV-Datei eingelesen und aus diesem DataGridView möchte ich eine Zeile suchen und diese in mein DataGridView2 eintragen lassen.
    Ich habe jetzt selber mal geschaut wie weit ich komme und mein momentaner Stand ist, dass ich die Zeile selectiere und wenn ich diese an mein Datagridview2 übergeben will steht nur "True" statt die Werte die sich in der Zeile befinden.

    VB.NET-Quellcode

    1. Dim eingabe As String
    2. Dim i, g As Integer
    3. eingabe = TextBox1.Text
    4. Try
    5. 'Durchläuft die Reihen bis zum Ende
    6. For i = 0 To DataGridView1.Rows.Count - 1
    7. 'Durchläuft die Spalte 0 (Artikelnummer)
    8. g = 0
    9. 'Ist Zelle gleich der Eingabe, dann selectier die Zeile
    10. If DataGridView1.Rows(i).Cells(g).Value = eingabe Then
    11. DataGridView1.Rows(i).Selected = True 'selectiert Zeile
    12. Dim b As String = DataGridView1.Rows(i).Selected
    13. DataGridView2.CurrentCell = DataGridView2.Rows(0).Cells(g)
    14. Dim Eintrag As String = b
    15. Dim parts() As String = Split(Eintrag, "Column")
    16. Dim RowCount As Integer = DataGridView2.RowCount - 1
    17. DataGridView2.Rows.Add()
    18. DataGridView2.BeginEdit(CBool(RowCount))
    19. Dim SplittCount As Integer = parts.Length - 1
    20. If SplittCount >= 0 Then
    21. For g = 0 To SplittCount
    22. DataGridView2.Rows(RowCount).Cells(g).Value = parts(g)
    23. Next g
    24. End If
    25. End If
    26. Next i
    27. DataGridView2.Update()
    28. DataGridView2.EndEdit()
    29. Me.Cursor = Cursors.Default
    30. Catch ex As System.NullReferenceExceptionMessageBox.Show(ex.Message)
    31. End Try


    Ich hab auch keine Ahnung ob der Split über Column geht?
    Vielen Dank
    xaverl
    Schau Dir mal Deine Zeile 12 an: da weist Du einem String einen Boole'schen Wert zu.

    Ich bin überhaupt neugierig wie weit das funktioniert, denn das Datagridview enthält ja in rows, cells Objekte und nicht Strings.

    Noch ein kleiner Tip: wenn Du sehen willst was Dein Code in jedem Schritt mach, so benutze den Debugger und gehe jede Zeile im Einzelschrittmodus durch.
    Hallo,

    ich komm hier irgendwie nicht weiter.
    Ich kann die bestimmte Zeile oder eine einzelne Zelle in meinem DataGridView selectieren und jetzt weiß ich nicht mehr weiter.
    Wie bekomm ich die selectierte Zeile aus meinem DataGridView1 in mein DataGridView2?

    VB.NET-Quellcode

    1. Dim eingabe As String
    2. Dim i, g As Integer
    3. eingabe = TextBox1.Text
    4. Try
    5. 'Durchläuft die Reihen bis zum Ende
    6. For i = 0 To DataGridView1.Rows.Count - 1
    7. 'Durchläuft die Spalte 0 (Artikelnummer)
    8. g = 0
    9. 'Ist Zelle gleich der Eingabe, dann selectier die Zeile
    10. If DataGridView1.Rows(i).Cells(g).Value = eingabe Then
    11. DataGridView1.Rows(i).Cells(1).Selected = True 'selectiert Zeile
    12. 'oder
    13. DataGridView1.Rows(i).Selected = True


    Danke
    Hallo ChaosBernd,

    dieses Beispiel kenne ich schon, auf dieses Beispiel habe ich meinen Code aufgebaut und meine Suchfunktion getestet (mit der Farbigen Hinterlegung). Das funktioniert auch, was ich genau noch brauche wäre eine Möglichkeit um den selectierten Teil in das zweite DataGridView zu kopieren.
    Zur Info meine beiden DataGridView haben (jetzt noch) die selbe Spalten Anzahl (dies werde ich aber ändern, wenn das mit der Zellenmarkierung auch funktioniert, da ich von den über 30 Spalten nur 4 benötige und somit den Speicher reduzieren kann) deshalb dachte ich das es einfacher wäre die gesamte Zeile zu selectieren und diese ins 2. DatagridView zu kopieren, aber nach der selectierung bin ich leider Ideenlos wie der nächste Schritt aussehen könnte.
    Keine Ahnung was das Kopieren bewirken soll - aber Du wirst Dir schon etwas dabei gedacht haben :rolleyes:

    Aber in Deinem Code selektierst Du ja zunächst mal nur 1 Zelle, nicht die ganze Zeile. Keine Ahnung ob das DGV auf FullRowSelect gestellt wurde ...

    Um auf Ideen zu kommen ist dafür die Dokumentation des DGV und seiner Unterklassen in MSDN sehr nützlich. Hier steht auch wie man die SelectedRows ausliest.
    Das mitm Kopieren stelle ich mir so vor, dass ich in meiner Form1 mein DataGridView1 habe in die ich eine CSV-Datei mit dem Artikelstamm einlese. Aus diesem Artikelstamm greife ich durch meine Form2 durch einen Suchbefehl einen Artikelstamm raus den ich dann in der Form3 in meinem DataGridView2 darstelle. In dieses DataGridView2 sollen dann noch die Messwerte einer Messmaschine geschrieben werden und diese Datei will ich dann wieder in eine CSV-Datei speichern. Das speichern soll hier für jeden Artikel extra ablaufen.
    So stell ich mir das vor, da ich vom programmieren her noch in die Kategorie Anfänger falle weiß ich nicht ob das der optimale Weg ist aber ich denke das dürfte funktionieren.
    Falls es da eine einfachere Möglichkeit gibt bin ich gerne für Vorschläge offen.
    @SystemUnknow
    Erstmal danke für die Links. Da dieses Beispiel auf ein DataTable ausgelegt ist hab ich da noch ein Problem.
    Spoiler anzeigen


    VB.NET-Quellcode

    1. Dim dt As DataTable = DieDataTable 'als was muss ich dt deklarierenDim cols As New List(Of DataColumn)
    2. Dim rows As New List(Of Integer)
    3. For Each dgvc As DataGridViewCell In DataGridView1.SelectedCells
    4. Dim spalte As DataColumn = dt.Columns(dgvc.OwningColumn.Index)
    5. If Not cols.Contains(spalte) Then
    6. cols.Add(spalte)
    7. End If
    8. If Not rows.Contains(dgvc.OwningRow.Index) Then
    9. rows.Add(dgvc.OwningRow.Index)
    10. End If
    11. Next
    12. 'cols.Sort(New Comparison(Of DataColumn)(AddressOf ColumnSorter))
    13. 'rows.Sort()
    14. Dim dt1 As DataTable = dt.Clone 'als was muss ich dt1 deklarieren
    15. 'dt1.PrimaryKey = Nothing
    16. Dim rcl As New List(Of DataColumn)
    17. For Each dc As DataColumn In dt1.Columns
    18. Dim fnd As Boolean = False
    19. For Each dc1 As DataColumn In cols
    20. If dc1.ColumnName = dc.ColumnName Then
    21. fnd = True
    22. Exit For
    23. End If
    24. Next
    25. If Not fnd Then
    26. rcl.Add(dc)
    27. End If
    28. Next
    29. For Each dc As DataColumn In rcl
    30. dt1.Columns.Remove(dc)
    31. Next
    32. For Each row As Integer In rows
    33. Dim dr As DataRow = dt1.NewRow()
    34. For Each cell As DataGridViewCell In DataGridView1.Rows(row).Cells
    35. If cell.Selected Then
    36. Dim dc As DataColumn = dt.Columns(cell.ColumnIndex)
    37. dr(dc.ColumnName) = DataGridView1.BindingSource(row)( _
    38. dc.ColumnName)
    39. End If
    40. Next
    41. dt1.Rows.Add(dr)
    42. Next
    43. Form3.DataGridView2.DataSource = New BindingSource(dt1, Nothing)




    Wie muss ich hier die DataTable declarieren??
    Danke
    du hast schon in deine Code deklaration:

    [s]DataTable: http://msdn.microsoft.com/de-de/library/system.data.datatable(VS.80).aspx


    [/s]
    EDIT1// Die beispiele die ich gepostet habe, damit du anschaust wie die Daten aus DataGridView kopiert werden, anhang die Beispiele muß du dir eigene Code basteln.


    EDIT2// Du brauchst zwei schleifen. Erste Schleife für Zeilen und zweite Schleife für Spalten (schau dir "verschachtelte Schleifen" an). Mit Schleifen läufst Zeilen und Spalten durch und in der Schleife addest ausgelesenen Text aus DataGridView1 in DataGridView2.

    Dieser Beitrag wurde bereits 16 mal editiert, zuletzt von „SystemUnknow“ ()

    für alle Einträge:

    VB.NET-Quellcode

    1. DataGridView1.ReadOnly = True
    2. For R = 0 To DataGridView1.Rows.Count - 1
    3. DataGridView2.Rows.Add(1) 'Funktioniert nur bei nicht Datengebundenen DataView's, ansonsten andere Methode wählen...
    4. For i = 0 To DataGridView2.Columns.Count - 1
    5. DataGridView2.Item(i, R).Value = DataGridView1.Item(i, R).Value.ToString
    6. Next
    7. Next
    8. DataGridView1.ReadOnly = False


    für Selektierte:

    VB.NET-Quellcode

    1. For Each SRow As DataGridViewRow In DataGridView1.SelectedRows
    2. DataGridView2.Rows.Add(1) 'Funktioniert nur bei nicht Datengebundenen DataView's, ansonsten andere Methode wählen...
    3. For i = 0 To DataGridView1.Columns.Count - 1
    4. DataGridView2.Item(i, SRow.Index).Value = DataGridView1.Item(i, SRow.Index).Value.ToString
    5. Next


    Speichern...


    Ciao...
    Naja, Fehlermeldungen sind schön und gut, aber vielleicht solltest du mal den Stack Trace im Debugger anschaun. Dann weist du auch woher das kommt. Ich vermute mal das du eine Tabelle erstellt hast ohne den Konstruktur aufzurufen. Das machst du mit:

    Dim DT As New DataTable
    Kurz mal mein Quelltext:

    VB.NET-Quellcode

    1. Try
    2. 'Durchläuft die Reihen bis zum Ende
    3. For i = 0 To DataGridView1.Rows.Count - 1
    4. 'Durchläuft die Spalte 0 (Artikelnummer)
    5. g = 0
    6. 'Ist Zelle gleich der Eingabe, dann selectier die Zeile
    7. If DataGridView1.Rows(i).Cells(g).Value = eingabe Then
    8. 'selectiert Zellen
    9. DataGridView1.Rows(i).Selected = True
    10. End If
    11. Next i
    12. For Each SRow As DataGridViewRow In DataGridView1.SelectedRows
    13. Form3.DataGridView2.Rows.Add()
    14. For g = 0 To DataGridView1.Columns.Count - 1
    15. Form3.DataGridView2.Item(g, 0).Value = DataGridView1.Item(g, SRow.Index).Value.ToString
    16. Next
    17. Next
    18. Me.Cursor = Cursors.Default
    19. Catch ex As System.NullReferenceExceptionMessageBox.Show(ex.Message)
    20. End Try
    21. 'Form3 aufrufen
    22. Dim Window As New Form3
    23. End Sub


    Der Fehler muss in Zeile 12 bis Zeile 15 stecken.



    Edit: Hat jemand eine Idee dazu denn ich hab nämlich keine.

    @sirblacksoul: was meinst du mit Stack Trace im Debugger und wo find ich den

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xaverl“ ()

    xaverl schrieb:

    For Each SRow As DataGridViewRow In DataGridView1.SelectedRows
    Form3.DataGridView2.Rows.Add()
    For g = 0 To DataGridView1.Columns.Count - 1
    Form3.DataGridView2.Item(g, 0).Value = DataGridView1.Item(g, SRow.Index).Value.ToString

    Also so wie cih das lese kann das nicht funktionieren.
    Du durchläufst in form1 das DGV jede Zeile mit For Each (ROW) die Zeilen.
    Bei jeder Schleife machst du eine ADD()
    innerhalb der Schleife machst du dann eine weitere Schleife, aber in Form3

    ich glaube da verhedderst du dich.