none
Datagridview ändern und an Datasource weitergeben RRS feed

  • Frage

  • Hallo Leute,

    ich stehe hier vor einem Problem und komme einfach nicht weiter.

    Ich haben eine Datagridview (DGVTask) und lasse mir in einer RTFbox einen Wert anzeigen (ungebunden). Wenn ich die RTFbox ändere führe ich folgende Funktion aus damit der aktuelle Inhalt in die Zelle zurückgeschrieben wird.

    Private Sub RtfZusatzinfo_LostFocus(sender As Object, e As EventArgs) Handles RtfZusatzinfo.LostFocus
            DGVTask.CurrentRow.Cells(GridCol.Zusatzinfo).Value = RtfZusatzinfo.Rtf
    End Sub

    Das alles funktioniert.

    Wenn ich jetzt die Zeile im DGVTask wechsle, dann ändert sich auch der DataRowState in der zugrundeliegenden Tabelle, so dass ich alle geänderten Rows speichern kann.

      Private Sub BtnSave_Click(sender As Object, e As EventArgs) Handles BtnSave.Click
            Dim strSQL As String = ""
            Dim dRow As Data.DataRow
           
            Try
    
            For Each dRow In DSet_Atom.Tables("tblTask").GetChanges.Rows
                    If dRow.RowState = DataRowState.Modified Then
                        strSQL = "UPDATE tblTask SET " &
                                 "tblTask.olSubject = ?" &
                                 " , tblTask.olBody = ?" &
                                 " , tblTask.olCompanies = ?" &
                                 " , tblTask.olDueDate = ?" &
                                 " , tblTask.olStartDate = ?" &
                                 " , tblTask.olRemindertime = ?" &
                                 " , tblTask.olReminderset = ?" &
                                 " , tblTask.MitarbeiterID = ?" &
                                 " , tblTask.Dateiname = ?" &
                                 " , tblTask.Taskliste = ?" &
                                 " , tblTask.IsComplete = ?" &
                                 " , tblTask.Flag = ?" &
                                 " , tblTask.Kategorie = ?" &
                                 " , tblTask.Zusatzinfo = ?" &
                                 " WHERE (((tblTask.olEntryID)=" & dRow("olEntryID") & "));"
    
                    ElseIf dRow.RowState = DataRowState.Added Then
                        strSQL = "INSERT INTO tblTask (olSubject, olBody, olCompanies, olDueDate" &
                                 ", olStartDate, olRemindertime, olReminderset, MitarbeiterID, Dateiname, Taskliste, IsComplete, " &
                                 "Flag, Kategorie, Zusatzinfo) VALUES (@olSubject, @olBody, olCompanies, @olDueDate" &
                                 ", @olStartDate, @olRemindertime, @olReminderset, @MitarbeiterID, @Dateiname, @Taskliste, @IsComplete, " &
                                 "@Flag, @Kategorie, @Zusatzinfo)"
    
                    End If
    
                    Dim cmdUpdate As New OleDbCommand(strSQL, oledb_Notizen)
    
                    With cmdUpdate.Parameters
                        .Add("@olSubject", OleDbType.Char).Value = dRow("olSubject")
                        .Add("@olBody", OleDbType.Char).Value = dRow("olBody")
                        .Add("@olCompanies", OleDbType.Char).Value = dRow("olCompanies")
                        .Add("@olDueDate", OleDbType.Date).Value = If(IsDBNull(dRow("olDueDate")), DBNull.Value, CDate(dRow("olDueDate")))
                        .Add("@olStartDate", OleDbType.Date).Value = If(IsDBNull(dRow("olStartDate")), DBNull.Value, CDate(dRow("olStartDate")))   'd=Short Date
                        .Add("@olRemindertime", OleDbType.Date).Value = If(IsDBNull(dRow("olRemindertime")), DBNull.Value, CDate(dRow("olRemindertime"))) 't=Short Time
                        .Add("@olReminderset", OleDbType.Boolean).Value = dRow("olReminderset")
                        .Add("@MitarbeiterID", OleDbType.Integer).Value = dRow("MitarbeiterID")
                        .Add("@Dateiname", OleDbType.Char).Value = dRow("Dateiname")
                        .Add("@Taskliste", OleDbType.Boolean).Value = dRow("Taskliste")
                        .Add("@IsComplete", OleDbType.Boolean).Value = dRow("IsComplete")
                        .Add("@Flag", OleDbType.Integer).Value = dRow("Flag")
                        .Add("@Kategorie", OleDbType.Char).Value = dRow("Kategorie")
                        .Add("@Zusatzinfo", OleDbType.Char).Value = dRow("Zusatzinfo")
                    End With
    
                    cmdUpdate.ExecuteNonQuery()
    
                Next
                DSet_Atom.Tables("tblTask").AcceptChanges()
            Catch ex As System.Exception
    
                'System.Windows.Forms.MessageBox.Show("Error " & Err.Number & ": (" & Err.Description & ") in Prozedur BtnSave_Click von Modul Notiz_Desktop.FrmTaskliste", "Fehler in Zeile: " & Erl())
            End Try
    
    
    
        End Sub

    Wenn ich jetzt aber direkt aus der RTFbox die Speicherung durchführe, dann ändert sich nicht der DataRowState in der zugrundeliegenden Tabelle.

    Meine Frage ist nun, wie kann ich das DGVTask veranlassen, den RowState zu ändern, ohne das ich einen Zeilenwechsel durchführen muss.

    Ich bin mir sicher, dass ist ruckzuck erledigt, aber ich komme einfach nicht darauf.

    Vielen Dank im Voraus.

    Gruß Ahmed

    Samstag, 19. Januar 2019 17:59

Antworten

  • Hi Ahmed,
    Du musst Dir den aktuellen für die Bindung zuständigen CurrencyManager besorgen und ein EndCurrentEdit auslösen.

    Ich finde diese Arbeitsweise aber unpassend. Besser ist es, die Änderungen in die Datenquelle zu schreiben. Wenn Du ein passende Datenquelle nutzt (z.B. DataTable), dann werden die Änderungen auch sofort angezeigt. Mit dem Schreiben in die DataRow wird auch der RowState auf modified gesetzt.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Ahmed Martens Sonntag, 20. Januar 2019 09:51
    Samstag, 19. Januar 2019 18:10

Alle Antworten

  • Hi Ahmed,
    Du musst Dir den aktuellen für die Bindung zuständigen CurrencyManager besorgen und ein EndCurrentEdit auslösen.

    Ich finde diese Arbeitsweise aber unpassend. Besser ist es, die Änderungen in die Datenquelle zu schreiben. Wenn Du ein passende Datenquelle nutzt (z.B. DataTable), dann werden die Änderungen auch sofort angezeigt. Mit dem Schreiben in die DataRow wird auch der RowState auf modified gesetzt.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Ahmed Martens Sonntag, 20. Januar 2019 09:51
    Samstag, 19. Januar 2019 18:10
  • Hallo Peter,

    hey, auf die Idee bin ich gar nicht gekommen.

    Super, vielen Dank.

    Ich versuchs mal. Bei Problemen melde ich mich einfach wieder.

    Gruß Ahmed

    Samstag, 19. Januar 2019 18:14