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

Accès aux données Discussion :

[2.0] BindingSource : Existe-il un événement signalant une modification des données ?


Sujet :

Accès aux données

  1. #1
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut [2.0] BindingSource : Existe-il un événement signalant une modification des données ?
    Bonjour à tous.
    Je cherche un moyen d'être informé lors d'un changement apporté au DataRowView référencé par la propriété BindingSource.Current.
    Les événements CurrentItemChanged et CurrentChanged ne se sont pas déclenchés lorsque les données du DataRowView changent, mais uniquement au moment où la référence sur objet BindingSource.Current change.

    Un tel événément me permettrait de savoir qu'il a eu un changement, avant l'appel de BindingSource.EndEdit() ( méthode provoquant la mise à jour du DataSet ).

    Merci pour votre aide

  2. #2
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Je cherche un moyen d'être informé lors d'un changement apporté au DataRowView référencé par la propriété BindingSource.Current.
    Qu'appelles-tu changement exactement ? modification ?

    Tu as un évenement sur la DataView qui est RowChanged qui se déclenche quand une valeur de la ligne est modifiée.

    Tu peux aussi créer un test avant de lancer les EndEdit
    (C'est une idée, je ne l'ai jamais utilisé)

    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim RowOrig As System.data.DataRow
    Dim RowProp As System.data.DataRow
    Dim monDataRowView As DataRowView
     
    Bln_Modifier = False
     
    For i = 0 To monDataRowView.Row.ItemArray.Length - 1
        RowOrig = monDataRowView.Row.Item(0, DataRowVersion.Original)
        RowProp = monDataRowView.Row.Item(0, DataRowVersion.Proposed)
        Bln_Modifier = Bln_modifier Or VerifierRowAModifier(RowOrig, RowProp)
    Next

  3. #3
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut
    Salut Kelpan et merci pour ta réponse.

    Tu peux aussi créer un test avant de lancer les EndEdit
    En fait j'ai besoin d'être informé dès qu'une modification est apportée au DataRowView, et non pas d'aller vérifier avant l'appel de BindingSource.EndEdit().

    Tu as un évenement sur la DataView qui est RowChanged qui se déclenche quand une valeur de la ligne est modifiée.
    En fait c'est DataTable qui propose cet événement. On y accède via DataRowView.Row.Table.RowChanged. Le problème c'est que le DataTable en question est celui du DataSet sous jacent, et, par conséquent, cet événement est déclenché à l'appel de BindingSource.EndEdit().

  4. #4
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Désolé de ne pas pourvoir t'aider plus que ça, c'est un domaine que je ne maitrise pas trop.

    Par contre, la méthode Row_Changing ne peut-elle pas t'aider ?

    Code vb.net : 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 Row_Changing(ByVal sender As Object, ByVal e As DataRowChangeEventArgs)
     
        Dim RowOrig As System.data.DataRow
        Dim RowProp As System.data.DataRow
     
        Bln_Modifier = False
     
        For i = 0 To e.Row.ItemArray.Length - 1
             RowOrig = e.Row.Item(0, DataRowVersion.Original)
             RowProp = e.Row.Item(0, DataRowVersion.Proposed)
             Bln_Modifier = Bln_modifier Or VerifierRowAModifier(RowOrig, RowProp)
        Next
     
        If Not bln_modifier Then e.Row.RejectChanges()
    End Sub

  5. #5
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut
    Merci encore pour ton aide Kelpan.

    RowChanging (comme RowChanged) est un événement déclenché par DataTable. Comme je le disais dans le post précédent, le DataTable en question est celui du DataSet et l'événement ne sera pas déclenché avant l'appel de BindingSource.EndEdit().

  6. #6
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Ca m'étonne que CurrentItemChanged ne soit pas déclenché !
    Es-tu sûr que le changement que tu attends est bien un changement qui a été commité au niveau du DataRow sous jacent ?

  7. #7
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut
    Salut FRED.G.

    Es-tu sûr que le changement que tu attends est bien un changement qui a été commité au niveau du DataRow sous jacent ?
    Justement non. J'attends un changement sur le DataRowView référencé par la propriété Current, mais pas sur le DataRow du DataSet sous-jacent. En effet, la modif de ce dernier est déclenchée par BindingSource.EndEdit().

    Ce qui m'intéresse c'est l'événement déclenché, par exemple, dès qu'un TextBox bindé (dont la propriété Text a changé) perd le focus et où BindingSource.Current.Row.ItemArray["NomColonne"] est modifié.

  8. #8
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Lorsque tu te "bindes" (avec ton BindingSource) sur une DataTable, la liaison n'est pas directe. Tu passes automatiquement par une vue du DataTable (un DataView).

    Le DataView par défaut est est celui renvoyé par la propriété DefaultView du DataTable.

    Donc, si tu as bindé une même instance de DataView, normalement les modifications dans les DataRowView seront bien répercutées dans chaque objet bindés (côté BindingSource et contrôles), les événements correctement déclenchés, etc sans appeler le EndEdit du DataRowview (ce que fait le EndEdit du BindingSource et qui au final aboutit au EndEdit du DataRow sous jacent).

    Mais si tu n'as pas utilisé partout la même instance du DataView ou d'un DataRowViex donné, alors c'est logique de devoir commiter le DataRow pour que tout le monde soit notifié des changements.

    Je n'ai pas fait de tests poussés mais c'est comme ça que je comprends la chose pour l'instant.

  9. #9
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut
    Merci pour ta réponse FRED.G.
    Voici comment je crée le BindingSource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myBindingSource = new BindingSource (myDataSet, "TableName");
    Et comment je crée un Binding pour un contrôle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myControl.DataBindings.Add(new Binding("ControlPropertyName", myBindingSource, "ColumnName"));
    J'utilise le même BindingSource pour tous les Bindings, donc le DataView dont tu parles (qui correspond à la propriété BindingSource.List) est apparemment le même pour tous.

    J'ai essayé d'utiliser l'événement ListChanged du DataView, mais lui aussi n'est déclenché qu'à l'appel de EndEdit().

  10. #10
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    J'ai essayé d'utiliser l'événement ListChanged du DataView, mais lui aussi n'est déclenché qu'à l'appel de EndEdit().
    Oui, sauf erreur c'est DataView.ListChanged qui notifie le BindingSource pour qu'ensuite génére son propre événement CurrentItemChanged.

    Bon après vérification, tu as raison, et j'ai dit une connerie tout à l'heure sur la notification sans le EndEdit.

    J'ai les mêmes résultats que toi je pense.

  11. #11
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Justement, ca tombe bien : le binding, c'est aussi le currency manager...PAs vraimnt surprenant que ton cas.

    En revanche, plutot que de bidouiller la vue, ton dataset lui aussi peut gerer les changements ...haschanged et reste beaucoup plus souple a l'usage.

    Notamment parce qu'il te permet de connaitre l'integralité des modification effectuées et de tenir compte des relations.

    Personiellement;j'utiliserai par ex sur une datagridview avec les toutes les propriétés d'ajout bidule et autre supprimées,

    Tu crées la toolbar qui va bien, tu fais un addnew, qui te permettra de créer de facto un nouvel enregistrement facilement identifiable, puisque courant.

    Et surtout tu peux connaitre l'index de l'enregistrement que tu ajoutes programmatiquement sans passer par un event supplémentaire.


    Derriere, libre a toi ....Soit de creer tout pour nettoyer la vue, soit d'attaquer le dataset directement en update.

    Cavir sur la cerise, tu peux même aussi renter a la mimine tes données dans le dataset, et avec la magie d'un bloc try catch rejeter les enregistrements defaillants en implementant ta propre logique metier.

    En revanche, laissons le binding là où il est le mieux : en restitution et en facilité de gestion des relations.

    A trop dependre de l'ide, ca finit souvent en orgie de bindingsources.

  12. #12
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Justement, ca tombe bien : le binding, c'est aussi le currency manager...PAs vraimnt surprenant que ton cas.
    Je ne vois pas ce que le currency manager vient faire là dedans ! Le currency manager est encapsulé par le BindingSource et donc doit notifier les changements de la liste source. La question était plutôt de savoir s'il faut systématiquement un EndEdit pour que les changements dans un DataRowView soient répercutés sur tous les contrôles bindés.

    En revanche, plutot que de bidouiller la vue, ton dataset lui aussi peut gerer les changements ...haschanged et reste beaucoup plus souple a l'usage.
    Pareil un de nous deux est HS. Car je ne vois pas comment le DataSet pourrait être informé de changements sur un DataRowView sans appel du EndEdit du DataRow sous-jacent.

  13. #13
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Pour info, voila le MP que j'ai adresse hier a FRED G sur le sujet, n'arrivant pas a me connecter.


    la petite experience :

    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
     
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Me.FilsParentBindingSource.AddNew()
        End Sub
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Me.BindingParent.AddNew()
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim d1 As New DataSet
            d1 = DataSet11.GetChanges()
            Try
                Me.DataGridView5.DataSource = d1.Tables(0)
            Catch ex As Exception
            End Try
        End Sub
    Voilà le code de lq form, qui contient :
    2 grid; une sur binding source parent la deuxieme sur binding source relation

    Les deux suivantes sont liees au dataset,
    La derniere affiche les ajouts
    Les petits boutons permettent juste de declencher des evenements simples pour visualiser les effets.

    Par A+B, il n'y a nullement besoin de travailler la vue pour updater un dataset.
    Il n'y a pas besoin de travailler le datarowview, qui comme son nom l'indique, n'est qu'une vue.

    Autre propriete interessante, tu verrras que la addnew declenche systematiquement le end edit.

  14. #14
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Tu es parti sur "comment détecter les répercutions dans un dataset, notament l'ajout de nouveaux enregistrements, sans utiliser d'événement".

    Je reconnais que le titre du thread est suffisament large pour qu'on puisse s'intéresser à la fois au côté modification en tant qu'ajout / suppression de ligne, ce que tu sembles avoir fait, et au côté modification en tant que changement des valeurs d'un item (en l'occurence, donc, les champ d'un datarowview), ce qui me semble être le point qui intéressait en priorité egoom (et en tout cas celui duquel nous discutions).

    Cependant tu es intervenu avec deux remarques un peu péremptoires, que tu n'as pas justifées et laissant plus ou moins supposer qu'egoom et moi étions complètement à côté de la plaque alors que c'est toi qui n'a pas compris de quoi nous parlions.

    J'ai commenté, t'invitant à justifier (ce que tu n'as pas fait), ceci :
    Justement, ca tombe bien : le binding, c'est aussi le currency manager...PAs vraimnt surprenant que ton cas.
    Et l'autre phrase balancée sans justification :
    En revanche, laissons le binding là où il est le mieux : en restitution et en facilité de gestion des relations.
    Le binding, c'est aussi la notification des changements et la liaison simple et complexe sans hiérarchie.

    Tu as certainement plein de choses intéressantes à nous faire partager, mais j'aimerais que tu sois plus précis dans tes interventions, surtout si tu souhaites remettre en cause la pertinence des propos des autres participants ou encore si tu dévies un tant soit soit peu l'angle sous lequel les choses ont été envisagées et débattues initialement.

  15. #15
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut
    Je suis désolé. C'est vrai que le titre du thread est trop large .
    A l'avenir j'essaierai d'être plus précis.

  16. #16
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Je profite du fait que le titre est un peu large pour poser une question.

    Je m'interesse à la manière dont le contrôle notifie l'objet BindingSource auquel il est bindé quand l'élément sélectionné change (par exemple quand on change la valeur d'une combobox, quand on séléctionne une ligne d'une datagridview...)

    Quelqu'un a une idée de comment ça se passe ?

    Merci d'avance.

    mathmax

  17. #17
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2005
    Messages : 64
    Par défaut
    bonjour,
    d'habitude j'ai utilise les évènements des controls ex sur un textbox : Validating

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/03/2017, 16h31
  2. Réponses: 2
    Dernier message: 13/07/2012, 13h08
  3. [PHP-JS] Gérer évènement dans une base de données
    Par drogba72 dans le forum Langage
    Réponses: 21
    Dernier message: 25/02/2009, 15h31
  4. Tester l'existence d'un index dans une base de données
    Par QuickSave dans le forum Bases de données
    Réponses: 4
    Dernier message: 31/01/2007, 13h41

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