IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

validation de données dans un DGV


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut validation de données dans un DGV
    Bonjour
    Je sollicite encore une fois votre aide pour résoudre mon pb de validation de données
    J'ai testé 2 solutions et une seule marche

    1) Solution qui marche
    Dans le formulaire 1 DGV et les 3 champs à coté dans des textBox
    La saisie des données lors d’un ajout se fait dans les Texbox

    Fonction enregistrement
    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
        Private Sub Enregistrement()
     
            If Validation() Then 'Test si la saisie est correcte
     
                Me.RangementBindingSource.EndEdit()
                Me.Validate()
     
                Try
                    Me.TableAdapterManager.UpdateAll(Me.RangementDataSet)
                    txt_status.Text = ""
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                End Try
            Else
                txt_status.Text = "Données non sauvegardées : les 2 champs doivent être remplis !"
            End If
        End Sub
    Fonction validation
    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
        Private Function Validation() As Boolean
            'Gestion des erreurs avant enregistrement
            Dim HasNoError As Boolean = True
            'EP1.Clear()
     
            If txt_lib.Text.Length = 0 Then
                HasNoError = False
            End If
     
            If txt_libCourt.Text.Length = 0 Then
                HasNoError = False
            End If
     
            Return HasNoError
     
        End Function
    2) Solution qui ne marche pas
    Les textbox sont supprimées, l’ajout se fait dans le DGV
    La fonction enregistrement reste la même

    La fonction validation devient
    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
      Private Function Validation() As Boolean
     
            Dim HasNoError As Boolean = True
     
            Dim row As RangementDataSet.RangementRow
            row = CType(CType(Me.RangementBindingSource.Current, DataRowView).Row, RangementDataSet.RangementRow)
            Dim RangementLib As String = row.RGM_LIB
            Dim RangementLibCourt As String = row.RGM_LIB_COURT
     
            If RangementLib.Length = 0 Then
                HasNoError = False
            End If
     
            If RangementLibCourt.Length = 0 Then
                HasNoError = False
            End If
     
            Return HasNoError
     
        End Function
    Si je clique sur enregistrement alors que le focus est toujours sur la dernière colonne du DGV la valeur entrée n’est pas considérée et cause une erreur , mais ça je pense pouvoir le corriger en forçant le focus ailleurs lors du clic enregistrement

    Si la valeur est nulle, elle n’est pas interceptée à temps car elle cause une erreur dans la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
           <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
             Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")>  _
            Public Property RGM_LIB() As String
                Get
                    Try 
                        Return CType(Me(Me.tableRangement.RGM_LIBColumn),String)
                    Catch e As Global.System.InvalidCastException
                        Throw New Global.System.Data.StrongTypingException("La valeur pour la colonne 'RGM_LIB' dans la table 'Rangement' est DBNull.", e)
                    End Try
                End Get
                Set
                    Me(Me.tableRangement.RGM_LIBColumn) = value
                End Set
            End Property

    Comment gérer les erreurs dans un DGV ??
    Par avance merci et bonne journée
    Bertrand

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour,
    l’évènement DataGridView.DataError peut peut-être t'aider ?

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonjour BasicZX81,
    Merci ! il est vrai que je m'obstine à empêcher l'erreur alors qu'il suffit peut être de la gérer !
    Je vais regarder en ce sens !
    Merci encore
    Bertrand

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Re,
    J'ai essayé une solution au niveau du DGV
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Private Sub DGV1_DataError(sender As Object, e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DGV1.DataError
            HasNoError = False
            MessageBox.Show("Error happened " & e.Context.ToString())
        End Sub
    Mais je n'ai jamais réussi à capturer quoique ce soit ??

    j'ai donc essayé une solution au niveau de la saisie
    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
    Private Sub DGV1_CellValidating(sender As Object, e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DGV1.CellValidating
            Dim headerText As String = DGV1.Columns(e.ColumnIndex).HeaderText
     
            If headerText.Equals("Libellé") Then
     
                ' Confirm that the cell is not empty.
                If (String.IsNullOrEmpty(e.FormattedValue.ToString())) Then
                    DGV1.Rows(e.RowIndex).ErrorText = "Le champ est obligatoire !"
                    txt_status.Text = "Le champ Libellé est obligatoire !"
                    'HasNoError = False
                    e.Cancel = True
     
                End If
     
            Else
                If headerText.Equals("Abréviation") Then
                    ' Confirm that the cell is not empty.
                    If (String.IsNullOrEmpty(e.FormattedValue.ToString())) Then
                        DGV1.Rows(e.RowIndex).ErrorText = "Le champ est obligatoire !"
                        txt_status.Text = "Le champ Abréviation est obligatoire !"
                        'HasNoError = False
                        e.Cancel = True
     
                    End If
                End If
            End If
     
     
        End Sub
     
        Private Sub DGV1_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV1.CellEndEdit
            ' Clear the row error in case the user presses ESC.   
            DGV1.Rows(e.RowIndex).ErrorText = String.Empty
        End Sub
    le code fonctionne empêchant de sortir de la cellule tant que celle ci n'est pas valide (non nulle) : cela fonctionne si on valide la dernière colonne en changeant de cellule
    Mais si on clique directement sur sauvegarder , l'erreur revient !!

    Je commence à nager grave !
    Merci

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour, m'en veux pas si j'ai un niveau un peu limité mais j'essaye de t'aider.
    J'ai juste remarqué une chose :
    Ta propriété RGM_LIB n'accepte pas les valeurs DBNull dans ce qui ressemble à une classe. Hors, à aucun moment tu ne valorise la donnée avec une valeur par défaut (non Null).
    Je ne suis pas spécialiste ni très sûre de ce que je dit mais je pense que la question a se poser est : peut tu accepter une valeur DBNull dans ton code et dans ce cas il faudrait modifier ta classe pour en tenir compte. Ou bien valoriser ta donnée avec une valeur par défaut pour que celle-ci ne soit pas Null.

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Re Bonjour,
    Loin de moi l'idée de critiquer toute idée me permettant d'avancer !
    Le DGV est rempli par un databindincource relié à une base SQL Server
    Pour mes essais, j'ai mis les 3 champs (ID, Lib, LIb court) à "nul interdit"

    Je potasse pleins de sites depuis tout à l'heure et si j'ai bien compris
    1) Il y a la solution en live "Cellvalidating" qui vérifie chaque donnée lorsqu'on quitte la cellule, mais dans mon cas si on clique sur le bouton "sauver" la dernière cellule n'est pas testée

    2) la solution générale basée sur le DGV dataerror mais qui intervient trop tard

    Lors de l'enregistrement j'ai un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.RangementBindingSource.EndEdit()
    Dois je le mettre avant ou après avoir testé la validation des données ?
    Si après la dernière cellule n'est pas prise en compte ?

    Par avance, merci
    bertrand

  7. #7
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonjour
    je vous remercie pour les liens :
    - je connaissais le 3ème : procédure pas à pas : c'est delà que j'ai repris le code de test cellule par cellule
    Mes reste à lire le reste !
    Merci
    Bertrand

  9. #9
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Avec la valeur par défaut cela devrait passer sans problème...

  10. #10
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Pour mes essais, j'ai mis les 3 champs (ID, Lib, LIb court) à "nul interdit"
    Je peut me tromper mais je ne peux donner un avis sur ce que je connais et perso je travaille avec un Dataset en mode déconnecté. Et dans mon cas le paramétrage des champs de la base de données pour interdire les champs Null n'affecte en aucune façon le Dataset connecté au Bindingsource et au DataGridView. C'est à dire que la base écrit bien des valeurs par défaut si elle reçoit des valeurs DBNull mais ça n'empêche pas d'avoir des valeurs DBNull au sein du Dataset. Je pense que c'est à toi de valoriser tes champs pour qu'il ne soit pas Null dans ton code.

    Perso j'ai fait un choix, d'une certaine façon j'accepte les valeurs DBNull dans mon Dataset mais pas dans mon code. Pour cela je me sert d'une classe pour stocker chaque données en 2 versions. Une version Original qui peut contenir DBNull et une version Current (qui me sert de variable courante pour faire mes calculs) qui contient la même donné sauf sans les valeurs Null (Dans ce cas si la valeur Original est DBNull j'écrit une valeur par défaut dans Current).

    C'est juste mon expérience personnel si ça peux aider.

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonsoir,
    Merci de ces conseils !!
    Dans ce cas particulier, j'avais mis "non nullable" aux 2 champs pour tester la fonction de validation et je pense que dans ce cas la valeur par défaut est la solution (par exemple pour les clés étrangères je fixe toujours une valeur par défaut pour ne pas risquer de casser l 'intégrité référentielle, et je le fait graphiquement dans dans dataset)
    Par contre, je voudrais savoir gérer "finement" la validation pour ne pas avoir d'erreur en cas de violation d'unicité, nul non autorisé, valeurs numériques aberrantes...
    Les explications données à
    http://msdn.microsoft.com/fr-fr/libr...=vs.85%29.aspx
    me semblent claires, mais je crois que c'est dans leur exploitation que je cafouille : je n'arrive pas à empêcher l'erreur de se déclarer !
    Merci encore
    Bertrand

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Re
    Autre solution : mettre les validations directement au niveau du dataset comme préconisé par MSDN
    http://msdn.microsoft.com/en-us/vstudio/bb643821
    je vais essayer ..!
    Bertrand

  13. #13
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Ta commande SetColmunError ne fait que renseigner l'utilisateur que la ligne n'est pas valide.
    - Pour ne pas écrire une ligne non valide dans le DataSet tu peux annuler ta ligne avec e.row.cancel dans l’évènement ColumnChanged.
    - Tu peux faire aussi comme moi : Dans l'évenement ColumnChanging tu gère toi même l'écriture dans le DataSet selon si ta ligne est valide ou pas avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub EventTableColumnChanging(sender As System.Object, e As System.Data.DataColumnChangeEventArgs)
    Dim ValeurIsValide as Boolean = TestMaLigne (e.row)
    Dim ColumnName As String = e.Column.ColumnName
    Dim OriginaleValue As Object = e.Row(ColumnName)
           If ValeurIsValide = True Then
               e.Row(ColumnName)=e.ProposedValue
            Else
                e.ProposedValue = OriginaleValue ' On ecrase la valeur proposé avec la valeur original pour annuler
            End If
    End Sub

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Entre temps, j'ai essayé la solution précédente (validation au niveau du dataset sur la vidéo de MSDN)

    j'ai modifié ma sub "enregistrement"
    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
    Private Sub Enregistrement()
            Me.Validate()
            Me.Activite1BindingSource.EndEdit()
     
            If Not ActiviteDataSet.HasErrors Then
                Try
                    Me.TableAdapterManager.UpdateAll(Me.ActiviteDataSet)
                    txt_status.Text = ""
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                End Try
            Else
                txt_status.Text = "Merci de corriger les erreurs avant l'enregistrement !"
                MessageBox.Show("Erreur de Saisie : merci de compléter les champs obligatoires !")
            End If
        End Sub
    Le fonctionnement est maintenant cohérent : tant que les données ne sont pas correctes, elle ne sont pas enregistrées !!
    BasicZX81, je vais regarder ton approche !
    Merci encore
    Bertrand

  15. #15
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonjour
    Merci BasicZX81 (ce pseudo me rappelle de bons moments avec des extensions 16k bricolées,..)
    La solution au niveau du dataset me semble plus logique mais aussi plus lourde à mettre en place, et je bute sur un champ integer que je n'arrive pas à "protéger" de la saisie de caractères.
    Ta solution me semble plus facilement généralisable (le code peut être repris d'un Form à l'autre) par contre
    - est ce que l'événement ColumnChanging est déclenché si l'utilisateur sort du DGV en cliquant directement sur un bouton du Form sans faire de déplacement par tab ou autre pour valider la dernière colonne modifiée ?
    - comment avertis tu l'utilisateur de la localisation de l'erreur ?
    Merci et A+
    Bertrand

  16. #16
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir, je vois que je ne suis pas tous seul à avoir bricolé le port d'extension, a l'époque je n'avais pas les moyens de m'acheter un pauvre lecteur de cassette, j'avais connecté une Eprom 64k qui traîné dans mon bric à brac...

    Bref, restons sur le sujet.
    Normalement ton dataGridView doit être lié a ta source de données donc dés que tu modifie une cellule, l’évènement ColumnChanging est levé immédiatement.
    L’intérêt de traiter ta validation dans cet évènement est de pouvoir intercepter n'importe quel modification qu'elle soit issue de ton dataGridView ou aussi provenant des tes contrôles simple si il sont liés aussi. Pour faire du code réutilisable ou générique, ça devient plus facile ainsi en effet. (Tu as plusieurs possibilités pour gérer le moment ou le contrôle va écrire effectivement dans la source en modifiant les paramètres DataBinding de ces contrôles avec "DataSourceUpdateMode").
    Par contre je procède différemment pour avertir l'utilisateur. Dans mon test de validation j'affiche des MessageBox et je fait une annulation comme je l'ai décrit plus haut.
    En procédant ainsi je ne peux pas avertir l'utilisateur avec SetColumnError puisque la saisie est immédiatement annulé. C'est un choix a faire, à toi de voir si tu peux "laissé passer" des valeurs non valides dans ton DataSet au risque je générer des erreurs ultérieurement au moment ou tu va enregistrer par exemple.
    Tu peux aussi très bien utiliser les 2 solutions. Par exemple tu interdit et annule immédiatement les saisies de caractères si ton champ est un Integer, pas la peine de prendre le risque de lever une erreur qui peut être évité ainsi.
    Espérant t'avoir aidé.

  17. #17
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonsoir,
    ZX80,ZX81, Oric, .. toute une époque avec un basic .. basique !
    Merci pour ces conseils : j'ai plusieurs dizaines de tables/formulaires à migrer de Access vers VB/SQL Server et donc mon principal critère est d'avoir le maximum de code générique ou facilement transposable
    La plupart des Formulaires seront très simplistes, et peu partageront le mêmes sources, donc la validation au niveau du Dataset se justifie moins !
    Le fait d'effacer les erreurs automatiquement me convient tout à fait, j'ai prévu une TextBox "Status" en bas de chaque Form pour afficher les différents messages.
    Dans ton code, je ne comprends cependant pas pourquoi tu testes tout un row et pas seulement la colonne quittée, cela t'oblige si j'ai bien compris dans ta procédure TestMaLigne à faire défiler toutes les colonnes, et en fonction de leur nom à faire les tests de validation adéquats
    mais comme je suis nul (débutant) en code, je suis surement passé à coté de qqchose
    Merci encore
    Bertrand

  18. #18
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir, Moi en fait j'avais un Alice mais comme personne connait et en plus on pourrait croire que c'est pour les filles alors j'ai marqué ZX81 dans mon Pseudo .

    Dans ton code, je ne comprends cependant pas pourquoi tu testes tout un row et pas seulement la colonne quittée
    Dans ColumnChanging, Je fait plus que la validation d'une cellule. En fait tout ce que j'appelle la logique métier s’exécute dans cet évènement (Telle cellule ne peut pas prendre telle valeur si telle cellule est égale à telle autre cellules....etc). C'est de la validation niveau cellule et de la validation niveau formulaire. Ça me permet également de bien séparer la couche métier et l'interface.
    si j'ai bien compris dans ta procédure TestMaLigne à faire défiler toutes les colonnes, et en fonction de leur nom à faire les tests de validation adéquats
    Oui, j'ai simplifié pour l'exemple mais dans TestMaligne je passe aussi d'autres paramètres en plus de e.Row et j'utilise également une autre procédure pour écrire une ou plusieurs colonnes (ou la ligne entiere) si la validation est Ok :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub EventTableColumnChanging(sender As System.Object, e As System.Data.DataColumnChangeEventArgs)
    Dim ColumnName As String = e.Column.ColumnName
    Dim ProposedValue = e.ProposedValue
    Dim OriginaleValue As Object = e.Row(ColumnName)
    Dim ValeurIsValide as Boolean = TestMaLigne (e.row, "EventColumnChanging", ColumnName, ProposedValue)
    if ValeurIsValide = true then
         Call EcritMaligne(e.Row, "EventColumnChanging")
    Else
         e.ProposedValue = OriginaleValue
    End If
    End Sub
    Par contre ça m'oblige à stocker chaque valeurs de colonnes dans des variables typés. Dans TestMaligne je stocke chaque valeurs dans ces variables et je réutilise ces mêmes variables dans EcritMaligne, (j'évite de faire des calculs directement sur des DataRow qui peuvent contenir des valeurs Null). C'est là que ma classe intervient comme je l'expliquais plusieurs Post plus haut. En effet sur le principe je stocke chaque valeur en 2 Versions (Original et Current) et je travaille avec la valeur Current. Ainsi je me débarrasse des risques d'erreurs en cas de DBNull. Petit à petit j'ai rajoutés des fonctionnalités à cette classe car je me suis appercus que au final toutes mes écritures se font dans cette classe sans exception alors j'en ai profité pour contrôler si les données doivent être écrites ou pas, juste pour éviter que la propriété HasChanges du dataSet soit modifié pour rien car c'est cette propriété que je contrôle pour proposer un enregistrement à la fermeture du programme.
    Si ça t'interresse je pourrais poster cette classe mais je fait de la programmation en amateur, les Pros font peut-être différemment mais moi elle me convient complètement.
    mais comme je suis nul (débutant) en code
    Je pense ça de moi aussi , pourtant je suis arrivé à faire un programme sympa que j'utilise tous les jours au boulot.

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonsoir,
    je n'ai pas tout lu en détail et suis peut être hors sujet.
    MSDN dit de DataGridView.RowValidating :
    Cet événement est analogue à l'événement Control.Validating. Utilisez cet événement pour effectuer la validation sur toutes les valeurs d'une ligne. Si la validation de la ligne échoue, affectez true à la propriété CancelEventArgs.Cancel. L'annulation de cet événement empêche les événements RowValidated, Control.Validating et Control.Validated de se produire ; cela empêche également l'utilisateur de quitter la ligne invalide et que la ligne soit enregistrée dans une source de données externe en mode lié aux données.

  20. #20
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonsoir,
    J'ose pas le dire mais moi aussi j'ai eu (et ai peut être encore dans un coin du sous sol) un Alice, mais je ne m'en suis jamais servi, je préférais l'Oric Atmos !!
    Nostalgie, quand tu nous tiens !
    L'application que j'essaie de faire est à titre purement perso et j'en serai très certainement l'unique utilisateur (donc à priori moins d'erreur de saisie :-), mais pour le fun je voudrais qu'elle soit quand même saine et un peu endurcie.

    Pour l'instant je suis trop "juste" pour juger de la qualité de ton code, mais je me rappelle bien qu'à l'IUT (il y a de cela bien longtemps) on nous enseignait qu'avant tout c'est le résultat qui compte : un code moche qui marche étant préférable à un code élégant qui foire, donc si ton code fait ce que tu attends de lui et qu'en plus tu as pris plaisir à le faire, je ne vois pas ce qu'il y aurait à redire !

    Bien entendu avoir un exemple de ta classe m'intéresserait, mais rien ne t'oblige !
    Par contre, aurais tu en tête un tuto expliquant clairement les événements et plus particulièrement l’utilisation des "e."something , je m'y perds !!
    Merci encore
    Bertrand

Discussions similaires

  1. [2.x] [Form] Validation des données dans un formulaire ?
    Par kolbek dans le forum Symfony
    Réponses: 4
    Dernier message: 11/09/2012, 12h45
  2. [Débutant] validation de données dans un formulaire
    Par marooh dans le forum C#
    Réponses: 0
    Dernier message: 04/08/2012, 03h28
  3. Réponses: 4
    Dernier message: 17/06/2012, 18h14
  4. Réponses: 2
    Dernier message: 09/06/2012, 10h26
  5. Réponses: 2
    Dernier message: 06/04/2007, 21h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo