none
rowState für Update RRS feed

  • Frage

  • Hallo zusammen,
    ich stehe gerade mal wieder vor einem RIESEN Fragenzeichen, betreffend wo liegt das Problem.

    Ich möchte im DataGridView_CellContentClick() Event
    den Inhalt einer Spalte verändern.

    Dazu setze ich den Wert der DataGridView Zelle.
    TabZeitDataGridView.Rows(e.RowIndex).Cells("dgvcolZeitKorrektur").Value = 195   (alter Wert 180)

    Ich gehe davon aus, dass sich jetzt auch der Inhalt der gebundenen DataRow ändert.
    Also
    drv = CType(TabZeitDataGridView.Rows(e.RowIndex).DataBoundItem, DataRowView)
    rowZeit = drv.Row
    der Inhalt von rowZeit.ZeitKorrektur der Wert von 180 auf 195 ändert, was auch tatsächlich der Fall ist, 
    und der RowState von Unchanged auf Modified wechselt.
    Der RowState bleibt allerdings auf Unchanged.


     Nach dem Aufruf von
     i = Me.TabZeitTableAdapter.Update(rowZeit)
    Return ist i=1,
    ist jedoch der Inhalt, nach dem erneuten Starten des Programms der alte.

    Ein Aufruf von
    rowZeit.SetModified()
    vor dem Update bringt auch keine Änderung.

    Hat mir jemand einen Tip bzw. Anregung wie ich zur Lösung? Sodass ich die veränderte Row abspeichern kann?

    Gruss Peter


    Inzwischen habe ich festgestellt, wenn ich die row auf diese Art verändere
    rowZeit.ZeitKorrektur = frmDgvTime._Minuten
    rowZeit.SetModified()
    beim Aufruf von Modified, der Inhalt der Row, wieder auf den alten zurückgesetzt wird !??

     

     

     

     

     

    Dienstag, 16. August 2011 10:59

Antworten

  • Inzwischen habe ich festgestellt, das nach dem ändern von Cell.Value ein BindingSource.EndEdit aufgerufen werden muss,
    dass die Werte in die gebundene DataRow übernommen werden.

    Es war Versuch und Irrtum, nicht Durchblick wieso.

    Gruss an Alle
    Peter

    Dienstag, 16. August 2011 15:00
  • Hallo Peter,

    auch wenn Du die Lösung bereits selbst gefunden hast, eine Erklärung dazu:

    Während eine Zeile bearbeitet wird, werden die Werte zunächst als Vorschlag (Proposed) betrachtet,
    siehe dazu DataRow.BeginEdit. Dadurch ist es möglich eine Bearbeitung abzubrechen (CancelEdit).

    Das DataGridView führt diese Aktionen automatisch aus, wenn über die Benutzeroberfläche eine
    neue Zeile angesteuert wird, in dem sie die CurrencyManager.EndCurrentEdit-Methode aufruft -
    was im Falle einer BindingSource mit dem CurrencyManager identisch wäre.
    Das landet wiederum über DataRowView.EndEdit bei DataRow.EndEdit.

    Manipulierst Du Daten direkt via Code so wird die Methode naturgemäß nicht automatisch ausgeführt,
    da kein Wechsel der bearbeiteten Zeile vom DataGridView erkannt werden kann.

    Gruß Elmar

     

    • Als Antwort markiert peter haus Mittwoch, 17. August 2011 06:34
    Dienstag, 16. August 2011 18:54
    Beantworter

Alle Antworten

  • Servus Peter,

    warum das im einzelnen nicht funzt kann ich nicht sagen aber folgender Code funzt

          dataAdapter1 = New OleDb.OleDbDataAdapter("Select * ....", DBCon.ConnectionString)
    
          'Command erstellen für Update, insert und delete
          Dim commandBuilder1 As New OleDb.OleDbCommandBuilder(dataAdapter1)
          commandBuilder1.QuotePrefix = "["
          commandBuilder1.QuoteSuffix = "]"
    
          'Dim table1 As New DataTable()
          table1.Locale = System.Globalization.CultureInfo.InvariantCulture
          
          ' *** Primärschlüssel-Informationen beim Fill mit übernehmen
          dataAdapter1.MissingSchemaAction = MissingSchemaAction.AddWithKey
    
          dataAdapter1.Fill(table1)
          bindingSource1.DataSource = table1
    
    
          DataGridView1.DataSource = bindingSource1
          DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
          
    
    ' Hier jetzt deine Änderungen durchführen
    
          'Speichern
          dataAdapter1.Update(CType(bindingSource1.DataSource, DataTable))
    

     

    Dienstag, 16. August 2011 11:27
  • Hi,

    ein Update der Rows ist bei mir Problemlos.

    Es betrifft ausschlieslich das Update einer Row im DataGridView_CellContentClick() Event.

    Grüsse Peter

    Dienstag, 16. August 2011 13:05
  • Inzwischen habe ich festgestellt, das nach dem ändern von Cell.Value ein BindingSource.EndEdit aufgerufen werden muss,
    dass die Werte in die gebundene DataRow übernommen werden.

    Es war Versuch und Irrtum, nicht Durchblick wieso.

    Gruss an Alle
    Peter

    Dienstag, 16. August 2011 15:00
  • Hallo Peter,

    auch wenn Du die Lösung bereits selbst gefunden hast, eine Erklärung dazu:

    Während eine Zeile bearbeitet wird, werden die Werte zunächst als Vorschlag (Proposed) betrachtet,
    siehe dazu DataRow.BeginEdit. Dadurch ist es möglich eine Bearbeitung abzubrechen (CancelEdit).

    Das DataGridView führt diese Aktionen automatisch aus, wenn über die Benutzeroberfläche eine
    neue Zeile angesteuert wird, in dem sie die CurrencyManager.EndCurrentEdit-Methode aufruft -
    was im Falle einer BindingSource mit dem CurrencyManager identisch wäre.
    Das landet wiederum über DataRowView.EndEdit bei DataRow.EndEdit.

    Manipulierst Du Daten direkt via Code so wird die Methode naturgemäß nicht automatisch ausgeführt,
    da kein Wechsel der bearbeiteten Zeile vom DataGridView erkannt werden kann.

    Gruß Elmar

     

    • Als Antwort markiert peter haus Mittwoch, 17. August 2011 06:34
    Dienstag, 16. August 2011 18:54
    Beantworter
  • Hallo Elmar,

    ich hatte es erahnt, das es sich etwa so verhält, wie von Dir geschildert. Wusste es jedoch nicht wirklich.

    Vielen Dank für die Hintergrundinformation.

    Herzliche Grüsse
    Peter

    Mittwoch, 17. August 2011 06:34