Announcement

Collapse
No announcement yet.

in DataGridView per Code Daten ändern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • in DataGridView per Code Daten ändern

    Hallo,

    ich bin am verzweifeln. Ich habe ein DGV, welches ich an ein Datatable gebunden habe. Der User soll über eine Suchmaske eine TitelNr auswählen und diese soll automatisch in die entsprechende Zeile im DGV eingetragen werden. Der Eintrag wird auch am Bildschirm angezeigt, aber ich habe folgendes falsches Verhalten:
    - Wird ein bestehender Datensatz überschrieben, so wird nur der korrekte Wert in der SQL-Tabelle gespeichert, wenn der User zusätzlich einen anderen Wert im DGV ändert. Ansonsten werden die Werte nicht abgespeichert.
    - Beim Erzeugen einer neuen Zeile im DGV wird diese auch angezeigt, aber wenn der User z.B. ins Feld Menge clickt, um den Wert einzutragen, ist die Zeile auf einmal wieder leer.

    Was mache ich falsch oder ist mein Ansatz mittels DGV völlig falsch?

    Anbei noch Programmcode zum Füllen der DGV :

    Code:
            Dim strSQL, strSQL2 As String
            '-- Anfrage auch für das spätere Update
            strSQL2 = "Select * From AuftragPos Where AuftragsNr = '" & _
                    Me.txtAuftragsNr.Text & " '"
            '-- Anfrage für das Anzeigen
            strSQL = "SELECT AuftragPos.PosNr, Titel.ISBN, Titel.TitelKurz, " _
                & "AuftragPos.PreisPos as PreisPos, AuftragPos.Menge, Titel.Bestand, " _
                & "AuftragsNr, Titel.TitelNr, LieferNr, LieferDatum, LieferMenge, " _
                & "AuftragPos.Bemerkung, AuftragPos.ProZeit, AuftragPos.ProBenutzer, LoeschKz, MengeInBuch " _
                & "FROM Titel RIGHT OUTER JOIN " _
                & "AuftragPos ON Titel.TitelNr = AuftragPos.TitelNr " _
                & "WHERE AuftragsNr = '" & Me.txtAuftragsNr.Text & "'"
            dtBestellungPos.Clear()
            '-- Fehler AusnaHme generieren
            Try
                '-- data adapter erzeugen, dann fill the datatable
                SQLBestellungPos = New SqlClient.SqlDataAdapter(strSQL, MakeConn)
                SQLBestellungPos2 = New SqlClient.SqlDataAdapter(strSQL2, MakeConn)
                SQLBestellungPos.Fill(dtBestellungPos)
                SQLBestellungPos2.Update(dtBestellungPos)
    , zum Füllen nach Verlassen der Suchmaske:

    Code:
            Dim frm As New frmSuche()
            ' Display frm as a modal dialog
            frm.ShowDialog()
            'dgBestellung.Rows.Item(Me.Zelle).Cells("TitelNr").Value() = TitelNr
            
            Me.dgBestellung.Rows(Me.Zelle).Cells("AuftragsNr").Value = Me.txtAuftragsNr.Text
           MaxPos = MaxPos + 1
            Me.dgBestellung.Rows(Me.Zelle).Cells("PosNr").Value = MaxPos
             Me.dgBestellung.Rows(Me.Zelle).Cells("LieferMenge").Value = 0
            Me.dgBestellung.Rows(Me.Zelle).Cells("Menge").Value = 0
    
            Try
                Me.dgBestellung.Rows(Me.Zelle).Cells("TitelNr").Value = TitelNr
    ...
    und zum Speichern der Werte aus DGV in SQL:

    Code:
            Try
                '-- neue Zeile im Dataset
                If newDS Then
                    ds.Tables(Table).Rows.Add(dr)
                    'MsgBox(newDS & dr(0) & "," & dr(1) & "," & dr(2) & "," & dr(3) & "," & dr(4) & "," & dr(5) & "," & dr(6) & "," & dr(7) & "," & dr(8) & "," & dr(9) & "," & dr(10) & "," & dr(11) & ",")
                End If
                '-- command builder wird erstellt cb=command builder
                Dim cb As SqlClient.SqlCommandBuilder
                cb = New SqlClient.SqlCommandBuilder(SQL)
                If newDS Then
                    '-- Have the command builder create an Insert SQL command
                    SQL.InsertCommand = cb.GetInsertCommand
                Else
                    '-- Have the command builder create an update SQL command
                    SQL.UpdateCommand = cb.GetUpdateCommand
                End If
                '-- Perform the update SQL command, then close the connection
                SQL.Update(ds, Table)
                ds.Tables(Table).AcceptChanges()
                If newDS Then
                    SQL.InsertCommand.Connection.Close()
                Else
                    SQL.UpdateCommand.Connection.Close()
                End If
    Danke

  • #2
    Hallo,

    in der Tat: Dein Vorgehen ist falsch, jedenfalls in einer Hinsicht. Du holst die Daten per SQL in eine DataTable: gut. Du speicherst sie aus der DataTable: gut. Du trägst eine neue Zeile in das DataGridView ein: sehr schlecht.

    Ersetze den Abschnitt "zum Füllen nach Verlassen der Suchmaske" durch DataTable.NewRow() - siehe das Beispiel in der SDK-Doku/MSDN - und die meisten Probleme lösen sich automatisch auf.

    Merke: Per Code wird in der Regel nicht das DataGridView bearbeitet, sondern die dahinterliegende Datenmenge!

    Jürgen

    Comment


    • #3
      Hallo Jürgen,

      vielen Dank für die Info. Es sieht jetzt in der Tat besser aus. Aber wie bekommt der SQLCommandBuilder mit, dass eine Zeile geändert wurde und er diese abspeichern soll?

      Code:
                      SQL.UpdateCommand = cb.GetUpdateCommand
      Im Moment muss der User in der DGV erst irgendeinen Wert in irgendeiner Zeile ändern, dann funktioniert alles, aber ohne diese Änderung wird das .NewRow beim Speichern ignoriert.

      Helf mir hier auch auf die Sprünge.

      Danke

      Comment


      • #4
        Zum NewRow gehört auch Rows.Add() - hast Du das vielleicht vergessen? (Das glaube ich freilich nicht, sonst würde die Zeile im DataGridView nicht angezeigt.) Ein weiterer Punkt ist, dass vor dem Speichern DataGridView.EndEdit() oder DataRow.EndEdit() oder BindingSource.EndEdit() auszuführen ist (je nach Situation eine dieser Methoden).

        Gruß Jürgen

        Comment


        • #5
          Es lag ein Fehler im Programmcode bei mir vor. Wenn man nie zur Speicherprozedur kommt, kann auch nichts gespeichert werden :-(
          Nun funktioniert alles.

          Danke

          Comment

          Working...
          X