Bonsoir a tous,
Je suis en train de revisiter mes procédures de validations en particulier pour abandonner l'evevenement DataTable.ColumnChanging et utiliser les événements de validations plus standard coté contrôles UI.
Tout mes contrôles (DataGridView + Contrôles standard sont DataBindés a un Bindingsource unique).
je ne sais pas ou je me trompe mais je n'arrive pas a annuler annuler les modifications faite dans le DataGridView. Noter que la source de données n'est jamais mis a jour automatiquement a partir des contrôles simples (DataSourceUpdateMode.Never), les écritures dans mes tables sont ne sont réalisé seulement si les modifications sont valides (dans les événements Validated).

Quelques lignes de code de paramétrages :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
' Paramétrage et liaisons a la source de données pou le DataGridView :
DataGridView1.CausesValidation = True
DataGridView1.DataSource = MainBindingSource
 
' liaison a la source de données pour les contrôles simples :
Dim Bind as New Binding("Text", MainBindingSource, TableTaches.SUJET, True, DataSourceUpdateMode.Never)
TextBoxSUJET.DataBindings.Add(Bind)
 
' je préfere déclencher moi même les événements de validation :
Me.AutoValidate = Windows.Forms.AutoValidate.Disable
 
' Ces événements vont exécuter me.Validate :
AddHandler DataGridView1.CurrentCellDirtyStateChanged, AddressOf EventFromUserControls
AddHandler TextBoxSUJET.KeyDown, AddressOf EventFromUserControls
 
' Ces événements sont exécutés après me.validate
AddHandler DataGridView1.Validating, AddressOf EventControlsValidating
AddHandler TextBoxSUJET.Validating, AddressOf EventControlsValidating
Les procédures principales :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
 
' La procédure pour déclencher la validation du formulaire :
 Private Sub EventFromUserControls(ByVal sender As Object, ByVal e As System.EventArgs)
        Me.Validate()
    End Sub
 
' Procédure générique qui acceptent les événements de validation du DatagridView ainsi que les contrôles simples :
 Private Sub EventControlsValidating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
        Dim Ctrl As Control = CType(sender, Control)
        Dim ColChangingName As String = Nothing 
 
        If TypeOf Ctrl Is DataGridView Then
            ' la propriété dataBinding du Controle n'est pas assignée (Cas des DataGridView)
            Dim dg As DataGridView = CType(Ctrl, DataGridView)
            ColChangingName = dg.CurrentCell.OwningColumn.DataPropertyName
        Else
            ' la propriété dataBinding du Controle est assignée (Cas des Controles simples)
            ColChangingName = Ctrl.DataBindings.Item(0).BindingMemberInfo.BindingMember
        End If
 
        Dim ColChangingValue As Object = Nothing
        Dim RowView As DataRowView = CType(MainBindingSourceTaches.Current, DataRowView)
        Dim Row As DataRow = RowView.Row
        Dim OriginaleValue As Object = Row(ColChangingName)
        Dim Isvalide As Boolean = False
        Dim errorMsg As String = Nothing
 
        ' Obtient la valeur réelle du contrôle débarrassée de son formatage :
        Get_Ctrl_RealBindingValueWithoutFormat(sender, ColChangingValue)
 
        ' Retourne le résultat de la validation :
        Isvalide = CalculRowValues(Row, "UserControls", ColChangingName, ColChangingValue, errorMsg)
 
        If Isvalide = True Then
        ' Si c'est valide on  ne fait rien, les écritures sont effectués dans Validated
        Else
        ' Si c'es invalide on annule :
            If TypeOf Ctrl Is DataGridView Then
                ' la propriété dataBinding du Controle n'est pas assignée (Cas des DataGridView)
                Dim dg As DataGridView = CType(Ctrl, DataGridView)
                e.Cancel = True
            Else
                ' la propriété dataBinding du Controle est assignée (Cas des Controles simples)
                e.Cancel = True
                Ctrl.DataBindings.Item(0).ReadValue()
            End If
        End If
    End Sub
 
' Procédure générique, écrit dans la source de données si les modifications n'ont pas été annulées :
 
  Private Sub EventControlsValidated(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
        Dim Ctrl As Control = CType(sender, Control)
        Dim ColChangingName As String = Nothing
 
        If TypeOf Ctrl Is DataGridView Then
            ' la propriété dataBinding du Controle n'est pas assignée (Cas des DataGridView)
            Dim dg As DataGridView = CType(Ctrl, DataGridView)
            ColChangingName = dg.CurrentCell.OwningColumn.DataPropertyName
        Else
            ' la propriété dataBinding du Controle est assignée (Cas des Controles simples)
            ColChangingName = Ctrl.DataBindings.Item(0).BindingMemberInfo.BindingMember
        End If
 
        Dim ColChangingValue As Object = Nothing
        Dim RowView As DataRowView = CType(MainBindingSourceTaches.Current, DataRowView)
        Dim Row As DataRow = RowView.Row
        Dim OriginaleValue As Object = Row(ColChangingName)
        Dim Isvalide As Boolean = False
        Dim errorMsg As String = Nothing
 
        ' Obtient la valeur réelle du contrôle débarrassée de son formatage :
        Get_Ctrl_RealBindingValueWithoutFormat(sender, ColChangingValue)
 
        ' Ecrit dans le DataTable :
        Call WriteRowValues(Row, "UserControls", ColChangingName, ColChangingValue, errorMsg)
 
    End Sub
Au passage vous noterait que j'utilise Ctrl.DataBindings.Item(0).ReadValue() pour "faire plus propre", je remets la valeur d'origine dans le contrôle si la modification est invalide. j'aimerais aussi faire de même dans le DataGridView mais le problème essentiel est l'annulation est surtout empêcher l'écriture dans la source.

je suis ouvert pour toutes suggestions, il y a surement des choses que je ne fait pas correctement. Je sais aussi que je doit améliorer mon code (je trouve qu'il y trop de codes dupliqués entre validating et Validated).

Merci a vous.