Datagridview Selected Rows nach DataSource Update

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von tScheckSn.

    Datagridview Selected Rows nach DataSource Update

    Hallo,

    Ich habe folgendes Problem:
    Ich habe ein Datagridview, welches nicht direkt bearbeitet werden kann.
    Nur per Doppelklick öffnet sich ein eigenes fenster, in dem die jeweilige Zeile bearbeitet werden kann.
    Nach dem Bearbeiten schreibe ich diese infos direkt in die Datenbank. Anschließend muss daher die DataSource aktualisiert werden.

    Damit dann immer noch die selbe Zeile(n) ausgewählt sind habe ich das Datagridview folgendermaßen überschrieben:

    VB.NET-Quellcode

    1. Overloads Property DataSource As Object
    2. Get
    3. Return MyBase.DataSource
    4. End Get
    5. Set(value As Object)
    6. SelectedIDs = getSelectedRowsID()
    7. 'Dim a As String = ""
    8. 'For i As Integer = 0 To SelectedIDs.Count - 1
    9. ' a &= "; " & SelectedIDs(i)
    10. 'Next
    11. 'MsgBox(a)
    12. MyBase.DataSource = value
    13. End Set
    14. End Property
    15. Protected Overrides Sub OnDataSourceChanged(e As EventArgs)
    16. MyBase.OnDataSourceChanged(e)
    17. If Not IsNothing(_IDColumnName) Then
    18. If Not IsNothing(Me.Columns(_IDColumnName)) Then
    19. Me.Columns(_IDColumnName).Visible = False
    20. End If
    21. End If
    22. 'Content Menue Strip
    23. For i As Integer = 0 To Me.Rows.Count - 1 Step 1
    24. 'Context Menü Strip Zuweisen
    25. Me.Rows(i).ContextMenuStrip = _RowContextMenuStrip
    26. Next
    27. setSelectedRowsID(SelectedIDs)
    28. End Sub
    29. Public Property IDColumnName As String
    30. Get
    31. Return _IDColumnName
    32. End Get
    33. Set(value As String)
    34. _IDColumnName = value
    35. End Set
    36. End Property
    37. Public Function getCurrentRowID() As Object
    38. If (Not IsNothing(Me.CurrentRow)) And (Not IsNothing(Me.IDColumnName)) Then
    39. If Not IsNothing(Me.CurrentRow.Cells(_IDColumnName)) Then
    40. Return Me.CurrentRow.Cells(_IDColumnName).Value
    41. End If
    42. End If
    43. Return Nothing
    44. End Function
    45. Public Function getSelectedRowsID() As Object()
    46. Try
    47. If (Not IsNothing(Me.IDColumnName)) Then
    48. Dim returnarray(Me.SelectedRows.Count - 1) As Object
    49. For i As Integer = 0 To Me.SelectedRows.Count - 1 Step 1
    50. returnarray(i) = Me.SelectedRows(i).Cells(_IDColumnName).Value
    51. Next
    52. Return returnarray
    53. End If
    54. Return Nothing
    55. Catch ex As Exception
    56. Return Nothing
    57. End Try
    58. End Function
    59. Public Sub setSelectedRowsID(ByRef liste() As Object)
    60. If IsNothing(IDColumnName) Then
    61. Return
    62. End If
    63. If IsNothing(liste) Then
    64. Return
    65. End If
    66. For i As Integer = 0 To Me.Rows.Count - 1
    67. Me.Rows(i).Selected = False
    68. Next
    69. For i As Integer = 0 To Me.Rows.Count - 1
    70. For j As Integer = 0 To liste.Length - 1
    71. If Me.Rows(i).Cells(IDColumnName).Value = liste(j) And Not IsNothing(liste(j)) Then
    72. Me.Rows(i).Selected = True
    73. Array.Clear(liste, j, 1)
    74. End If
    75. Next
    76. Next
    77. End Sub
    78. Public Sub printarray(ByVal l As Object())
    79. Dim ausgabe As String = "-"
    80. For i As Integer = 0 To l.Length - 1 Step 1
    81. ausgabe &= l(i) & "-"
    82. Next
    83. MsgBox(ausgabe & vbCrLf & "Länge: " & l.Length)
    84. End Sub


    Es werden auch nach dem Update die entsprechenden Zeilen richtig markiert.
    Mein Problem: Wenn ich die Pfeiltasten betätige beginnen diese immer bei der 1. Zeile. Also egal welche Zeile markiert ist, wenn man die Pfeiltaste nach unten drückt wird immer die Zweite Zeile ausgewählt.

    Ich habe bereits herausgefunden, dass auch CurrentCellAddress.Y auf 0 steht.
    Meine Frage: Wie setze ich richtig die Ausgewählten und Aktiven Zellen? Derzeit setue ich nur die Auswahl mit Me.Rows(i).Selected = True. Ich vermute es gibt aber noch eine art Aktive Zelle, die für die Pfeiltasten verwendet wird.

    Danke im Voraus!

    tScheckSn schrieb:

    ch habe ein Datagridview, welches nicht direkt bearbeitet werden kann.
    Nur per Doppelklick öffnet sich ein eigenes fenster, in dem die jeweilige Zeile bearbeitet werden kann.
    Nach dem Bearbeiten schreibe ich diese infos direkt in die Datenbank. Anschließend muss daher die DataSource aktualisiert werden.
    Das ist der falsche Workflow - nämlich von hinten durch die Brust ins Auge.
    Nach Bearbeiten des Datensatzes solltest du die Client-Daten aktualisieren - nicht die Datenbank.
    Denn - hast du ja gemerkt - es ist der Client, der dem User angezeigt wird - nicht die Datenbank.

    Wenn es dir ein Herzenswunsch ist, kannst du zusätzlich auch die Datenbank aktualisieren, aber wenn man zB mit dem Ado.Net-Instrumentarium arbeitet, ist das nichtmal sofort nötig.
    Denn ein Dataset merkt sich alle Änderungen, und kann jederzeit die DB auf einen aktuellen Stand bringen.
    Das eröffnet die Möglichkeit, einen expliziten Save-Button zu coden, sodass die Änderungen erst rückgespeichert werden, wenn der User das will (und dann alle auf einmal, was den Db-Traffic stark verringert).