Datagridview_RowsAdded

  • Allgemein

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

    Datagridview_RowsAdded

    Hi Comm,

    ich habe eine MySQLDatenbank und will per Datagridview einen Eintrag hinzufügen lassen.
    Für das Editieren habe ich das so gelöst:

    VB.NET-Quellcode

    1. Public Class DGVEntry
    2. Public RowIndx As Integer
    3. Public ColumnIndx As Integer
    4. Public oldVal As String
    5. End Class
    6. Dim entr As New List(Of DGVEntry)
    7. Dim ent As New DGVEntry
    8. Private Sub DataGridView1_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit
    9. ent = New DGVEntry
    10. ent.oldVal = DataGridView1.Rows(DataGridView1.SelectedCells(0).RowIndex).Cells(0).Value.ToString
    11. ent.RowIndx = DataGridView1.SelectedCells(0).RowIndex
    12. ent.ColumnIndx = DataGridView1.SelectedCells(0).ColumnIndex
    13. entr.Add(ent)
    14. End Sub
    15. Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
    16. SaveButton.Enabled = True
    17. End Sub
    18. Private Sub SaveButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveButton.Click
    19. Dim cmdTxT As String = Nothing
    20. For i = 0 To entr.Count - 1
    21. Dim tbl As String = SelectedTable
    22. Dim newVal As String = DataGridView1.Rows(entr(i).RowIndx).Cells(entr(i).ColumnIndx).Value
    23. If newVal = "True" Then newVal = 1
    24. If newVal = "False" Then newVal = 0
    25. Dim oldVal As String = entr(i).oldVal
    26. Dim ValClmn1 As String = DataGridView1.Columns(entr(i).ColumnIndx).HeaderText
    27. Dim ValClmn2 As String = DataGridView1.Columns(0).HeaderText
    28. cmdTxT &= "UPDATE " & tbl & " SET " & ValClmn1 & "='" & newVal & "' WHERE " & ValClmn2 & "='" & oldVal & "';" & vbNewLine
    29. Next
    30. Try
    31. Dim mycommand As New MySqlCommand(cmdTxT, Conn)
    32. mycommand.ExecuteNonQuery()
    33. entr.Clear()
    34. cmdTxT = Nothing
    35. SaveButton.Enabled = False
    36. Catch mysqlex As MySqlException
    37. MsgBox(mysqlex.Message.ToString, MsgBoxStyle.Critical)
    38. Catch ex As Exception
    39. MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
    40. End Try
    41. End Sub


    Aber beim Hinzufügen scheitere ich..

    Hoffe mir kann einer (oder mehrere) helfen!
    Danke schon im Vorraus!
    LG
    Merio
    Ach, das habichjetzt schon im anneren Post gepostet: ich glaub, für MySql gibts die gleiche Designer-Unterstützung.

    Hmm. Auf meim System nicht.

    Aber im INet fund ich gleich den MySqlDataAdapter, und da denkich, vlt. iwo eine Dll mit der MySql-Infrastruktur runterladen, dann geht das genauso.
    na, das UPDATE - Command passt natürlich nicht, wenn man einen INSERT ausführen muß.

    @Merio: Hast du was mit DesignerUnterstützung gefunden? Wichtig wäre, dass der Assistent anspringt, wenn man die Datenbank dem Projekt hinzufügt. Da werden die TableAdapter nämlich konfiguriert.


    Ansonsten kann man DataAdapter auch selbst konfigurieren, dass sie selbständig das richtige UPDATE, SELECT, DELETE, INSERT anwenden, mittm CommanBuilder geht das.
    Ich nehme an, wenn du schon MySqlCommands hast, und ich die MySqlDataAdapter im INet fund, dann hast du die Infrastruktur schon, und da wird auch ein MySqlCommandBuilder herumfahren.
    Hier der Code:

    VB.NET-Quellcode

    1. Dim tn As String = DataSet1.Tables(0).TableName
    2. Dim da As New MySqlDataAdapter("SELECT * FROM " & tn & ";", Conn)
    3. Dim clmns As String = "("
    4. For i = 0 To DataSet1.Tables(0).Columns.Count - 1
    5. If i = 0 Then clmns &= DataSet1.Tables(0).Columns(i).ColumnName Else clmns &= ", " & DataSet1.Tables(0).Columns(i).ColumnName
    6. Next
    7. Dim vls As String = Nothing
    8. For i = 0 To DataSet1.Tables(0).Columns.Count - 1
    9. If i = 0 Then clmns &= "@" & DataSet1.Tables(0).Columns(i).ColumnName Else clmns &= ", @" & DataSet1.Tables(0).Columns(i).ColumnName
    10. Next
    11. da.InsertCommand = New MySqlCommand("INSERT INTO " & tn & " " & clmns & ") VALUES (" & vls & ");", Conn)
    12. clmns = Nothing
    13. For i = 0 To DataSet1.Tables(0).Columns.Count - 1
    14. If i = 0 Then clmns &= DataSet1.Tables(0).Columns(i).ColumnName Else clmns &= ", " & DataSet1.Tables(0).Columns(i).ColumnName
    15. clmns &= "=@" & DataSet1.Tables(0).Columns(i).ColumnName
    16. Next
    17. da.UpdateCommand = New MySqlCommand("UPDATE " & tn & " SET " & clmns & " WHERE " & DataSet1.Tables(0).Columns(0).ColumnName & "=@" & DataSet1.Tables(0).Columns(0).ColumnName & ";", Conn)
    18. da.DeleteCommand = New MySqlCommand("DELETE FROM " & tn & " WHERE " & DataSet1.Tables(0).Columns(0).ColumnName & "=@" & DataSet1.Tables(0).Columns(0).ColumnName & ";", Conn)
    19. da.Update(DG1.DataSource)
    LG
    Merio
    Hier mal eine Lösung mit CommandBuilder. Die gibts bestimmt auch in MySql.

    Sehr angenehm bei denen ist, dass man nur den Select formulieren muß, Update, Insert, Delete denken die sich dann selber aus:

    VB.NET-Quellcode

    1. Private _CategoryAdapter As OleDbDataAdapter
    2. Private _ArticleAdapter As OleDbDataAdapter
    3. Private _Con As OleDbConnection
    4. Private Sub InitAdapters()
    5. _Con = New OleDbConnection( _
    6. "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\DBSample.MDB")
    7. Dim cmd = New OleDbCommand("Select * from Category", _Con)
    8. _CategoryAdapter = New OleDbDataAdapter(cmd)
    9. Dim CategoryBuilder = New OleDbCommandBuilder(_CategoryAdapter)
    10. cmd = New OleDbCommand("Select * from article", _Con)
    11. _ArticleAdapter = New OleDbDataAdapter(cmd)
    12. Dim ArticleBuilder = New OleDbCommandBuilder(_ArticleAdapter)
    13. End Sub
    14. Private Sub Save()
    15. 'Evtl in Bearbeitung stehende Zellwerte als Eingabe übernehmen
    16. If Not Me.Validate Then Return
    17. With Me.DBSampleDataSet.Category
    18. 'Dieser Block führt CategoryTableAdapter.Update() für gelöschte DataRows extra aus.
    19. '! Besonderheit: Die DataRelation wird kurzfristig "umkonfiguriert", sodaß
    20. '! DataRow.AcceptChanges auch für die ChildRows aufgerufen wird, damit sie vom
    21. '! ArticleTableAdapter.Update() ausgenommen werden.
    22. .ChildRelations(0).ChildKeyConstraint.AcceptRejectRule = AcceptRejectRule.Cascade
    23. Dim DeletedRows As DataRow() = .Select("", "", DataViewRowState.Deleted)
    24. _CategoryAdapter.Update(DeletedRows)
    25. .ChildRelations(0).ChildKeyConstraint.AcceptRejectRule = AcceptRejectRule.None
    26. End With
    27. _CategoryAdapter.Update(Me.DBSampleDataSet.Category)
    28. _ArticleAdapter.Update(Me.DBSampleDataSet.Article)
    29. System.Media.SystemSounds.Asterisk.Play()
    30. End Sub


    Also das speichert jetzt ein Dataset mit 2 verknüpften Tabellen.

    Im beiliegendem Gui kannst du die Tabellen nach Belieben editieren.
    Dateien
    Ich hab dir ein Beispiel mit Access-Technologie gemacht, mit OleDbCommand, OleDbDataAdapter und OleDbCommandBuilder.
    Ich hab gesehen, dasses für MySql entsprechendes gibt: MySqlCommand, MySqlDataAdapter, und daher gehe ich davon aus, dasses auch den MySqlCommandBuilder gibt.

    Also sollte es doch ein Klacks sein, meinen Access-Prototyp auf MySql umzuschreiben - inwiefern sollte XAMPP oder wer auch immer was dagegen haben? Die DataAdapter-Konfiguration ist doch komplett Client-Seitig - letztendlich abgeschickt werden die richtigen Queries, und gut is.

    Müsste sogar mit Suche-Ersetzen gehen - nur den ConnectionString müssteste anpassen.

    Ja gut, in meinem Sample liegt eine andere DB-Struktur vor, also wenn du meine (mitgelieferte) "DBSample" Datenbank auf deinem XAMPP hättest.
    (Wieso laden die Leuts eiglich nie meine Solutions runner, wennichse extra für sie entwickeln tu? :cursing: )