2016-06-02 5 views
1

Ich merke nur, dass, wenn der Benutzer etwas in einem DataGridView ändert und auch die letzte (neue) Zeile ohne Eingabe von Daten in es wählt, wenn das HasChanged Ereignis ausgelöst wird diese letzte neue Zeile enthalten ist diejenigen, die zur Datenbank hinzugefügt werden sollen. Ich bekomme dann einen Fehler, weil ich diesen Datensatz wegen der Nullwerte nicht in die Datenbank aufnehmen kann. Ich möchte diese Zeile in dieser speziellen Situation ausschließen, da sie nicht als eine hinzugefügt werden soll. Im Folgenden finden Sie meine aktuellen Code:Datensatz hat Änderungen für neue Zeile

For Each row As DataGridViewRow In Grid.Rows 
     If Not row.IsNewRow Then 
      Dim cellValue As String = String.Empty 
      For i = 1 To row.Cells.Count - 1 
       cellValue = row.Cells(i).Value.ToString 
       If String.IsNullOrEmpty(cellValue) Then 
        MsgBox("All fields has to be filled out") 
        Exit Sub 
       End If 
      Next 
     End If 
    Next 

    marke.MakeChangesDS() 

Public Sub MakeChangesDataSet() Implements IDAL.MakeChangesDataSet 
    If Not GetGeschaftDataSet.HasChanges Then 
     MessageBox.Show("No changes to be done", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Warning) 
    Else 
     Dim i As Integer 
     Try 
      Using MyConnection = New SqlConnection(strcon) 
       Using cmd As New SqlCommand("SELECT * FROM T_Marke", MyConnection) 
        MyConnection.Open() 
        ' Create a data adapter in the method and throw it away afterwards 
        Using GetProjectsDataAdapter = New SqlDataAdapter(cmd) 
         Dim cmdbuilder As New SqlCommandBuilder(GetProjectsDataAdapter) 
         i = GetProjectsDataAdapter.Update(GetGeschaftDataSet, "trial1") 
        End Using 
       End Using 
      End Using 
      MessageBox.Show("Updated" & i & " marks", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information) 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 
    End If 
End Sub 

Ich denke, ich sollte überprüfen und es in der MakeChangesDataSet Funktion ausschließen.

Antwort

0

Die SqlDataAdapter-Klasse verfügt über einen Ereignishandler mit dem Namen RowUpdating, mit dem Sie überprüfen können, ob Ihre Zeile gültig ist oder nicht, und das Aktualisieren dieser Zeile abbrechen, wenn Sie dies wünschen.

..... 
Using GetProjectsDataAdapter = New SqlDataAdapter(cmd) 
    Dim cmdbuilder As New SqlCommandBuilder(GetProjectsDataAdapter) 
    AddHandler GetProjectsDataAdapter.RowUpdating, AddressOf onUpdate 
    i = GetProjectsDataAdapter.Update(GetGeschaftDataSet, "trial1") 
    RemoveHandler GetProjectsDataAdapter.RowUpdating, AddressOf onUpdate 
End Using 

Dieses Ereignis wird für jede Zeile aufgerufen, die vor dem eigentlichen Update/Insert aktualisiert werden muss/Löschen auftritt. Der Ereignisbehandlungscode empfängt alle Informationen, die erforderlich sind, um zu entscheiden, was mit den Daten geschehen soll. Sie erhalten die StatementType, die Ihnen sagt, ob dies eine INSERT-, UPDATE- oder DELETE-Operation ist. Dann können Sie entscheiden, was mit der Zeile geschehen soll, die SqlRowUpdatingEventArgs.Status setzt, bevor eine Ausnahme von Ihrer Datenbank-Engine ausgelöst wird.

Sub OnUpdate(sender as Object, args As SqlRowUpdatingEventArgs) 
    If args.StatementType = StatementType.Insert Then 
     if Not IsYourRowValid(args.Row) Then 
      args.Status = UpdateStatus.SkipThisRow 
     End If 
    End If 
End Sub