2016-06-02 1 views
1

Je remarque juste que si l'utilisateur modifie quelque chose dans un DataGridView et sélectionne également la dernière (nouvelle) ligne sans y entrer de données, alors lorsque l'événement HasChanged se déclenche, cette dernière nouvelle ligne est incluse dans ceux à ajouter à la base de données. J'obtiens alors une erreur parce que je ne peux pas mettre cet enregistrement dans la base de données en raison des valeurs nulles. Je voudrais exclure cette rangée dans cette situation particulière car elle ne devrait pas être traitée comme une ligne à ajouter. Voici mon code actuel:Dataset a des modifications pour la nouvelle ligne

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 

Je pense que je devrais vérifier et l'exclure dans la fonction MakeChangesDataSet.

Répondre

0

La classe SqlDataAdapter a un gestionnaire d'événements appelé RowUpdating qui vous permet de vérifier si votre ligne est valide ou non et d'annuler la mise à jour de cette ligne si vous choisissez de le faire.

..... 
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 

Cet événement est appelé pour chaque ligne qui doit être mis à jour avant la mise à jour réelle/insertion/suppression se produit. Le code du gestionnaire d'événements reçoit toutes les informations requises pour décider quoi faire avec les données. Vous obtenez le StatementType qui vous indique s'il s'agit d'une opération INSERT, UPDATE ou DELETE. Ensuite, vous pouvez décider quoi faire avec la ligne définissant le SqlRowUpdatingEventArgs.Status avant toute exception est levée par votre moteur de base de données.

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