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 :

Events d'un Binding Navigator [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut Events d'un Binding Navigator
    Bonjour,

    J'ai créé un Binding Navigator (BN) pour un Datagridiew (DG)

    tout d'abord, je l'ai initialisé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     'création binding entre DG et BN
    ' DGBindingSource a été créé dans le designer
            DGBindingSource.DataSource = DG.DataSource
            Me.BN.BindingSource = DGBindingSource
            CurMa_DG = CType(Me.BindingContext(Me.dtv_DG), CurrencyManager)
    ' dtv_DG est un dataview du contenu de DG créé dans le designer
    Pour naviguer d'une ligne à l'autre en utilisant le BN, je donne la possibilité à l'utilisateur d'utiliser l'un des 3 méthodes suivantes :
    - les boutons de BN
    - les flèches du clavier
    - la souris.

    Pour les boutons du BN, cela donne ceci (par exemple pour aller à la ligne suivante) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       Private Sub BN_MoveNextItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BN_MoveNextItem.Click
            If CurMa_DG.Position < CurMa_DG.Count - 1 Then
                CurMa_DG.Position += 1
                DG.Rows(CurMa_DG.Position).Selected = True
                Me.DG.CurrentCell = DG.Rows(CurMa_DG.Position).Cells(1) 'utile pour mettre à jour l'identité du CurrentRow
    ' la ligne suivante me permet de gérer le scroll du DG à bon escient sachant que mon cadre n'affiche que 10 lignes.
                Me.DG.FirstDisplayedScrollingRowIndex = Math.Min(Math.Max(Me.DG.FirstDisplayedScrollingRowIndex,CurMa_DG.Position - 9), CurMa_DG.Position)
            End If
        End Sub
    Pour le flèches du clavier, cela donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub DG_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DG.KeyUp
                'séléctionne toute la ligne active
                Me.DG.CurrentRow.Selected = True
                Me.DG.CurrentCell = Me.DG.CurrentRow.Cells(1)
                CurMa_DG.Position = DG.CurrentRow.Index
                BN_PositionItem.Text = CurMa_DG.Position + 1
     
    End Sub
    La gestion par les boutons fonctionne parfaitement.
    En revanche, la gestion par la souris ou par le clavier fonctionne correctement pour la sélection des lignes et pour la mise à jour du TextBox BN_PositionItem, mais les boutons suivant restent grisés :
    - MoveFirst et MovePrevious si je suis sur la première ligne et que je sélectionne une ligne suivante
    - MoveLast et MoveNext si je suis sur la dernière ligne et que je sélectionne une ligne précédente.

    J'ai dû rater un truc, mais je ne vois pas trop quoi d'autant que j'ai mis des espions sur
    - CurMa_DG.Position
    - DG_CaveListeContenu.CurrentRow.Index

    ce qui m'a permis de vérifier la cohérence de ces valeurs par rapport à l'affichage.

    Pourquoi donc :
    - MoveFirst et MovePrevious restent grisés alors que CurMa_DG.Position>1
    - MoveLast et MoveNext restent grisés alors que CurMa_DG.Position<CurMa_DG.Count-1 ?

    Quelqu'un voit-il une explication ?

  2. #2
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    J'ai cherché toute la journée et j'ai trouvé une piste d'explication mais pas la solution pour y remédier.

    En effet j'ai testé un code qui ferait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      Private Sub BN_MoveNextItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BN_MoveNextItem.Click
     
    Call MySub()
     
    End Sub
     
    ...
    Private Sub DG_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DG.KeyUp
     
    Call MySub()
     
    End Sub
     
    'MySub est une procédure commune aux 2 événements qui gère le changement de ligne dans le DG
    Le fonctionnement est similaire à mon premier post :
    - Le premier appel de MySub fonctionne correctement et les boutons du BN se grisent et se dégrisent à bon escient.
    - Le deuxième appel de MySub fonctionne correctement mais les boutons du BN restent grisés (en fait d'autres tests m'ont permis de montrer que tout se passe comme si CurMa_DG.Position était bloqué à la position précédente)

    Donc cette façon de coder ne résout pas le pb...

    ...MAIS...

    montre que le fonctionnement de MySub n'est pas le même selon d'où cette procédure est appelée.

    Je suspecte donc qu'il s'agit d'un pb de lien parent-enfant entre la procédure appelante et la procédure appelée.

    Est-ce que cela vous aide à y voir plus clair dans la résolution de mon problème ? A défaut, où puis-je trouver un tuto expliquant comment régler ces problème de liens parent-enfant ?

  3. #3
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    A partir du moment ou le BindingNavigator est lié au bindingsource du DataGridView (BN.BindingSource = DGBindingSource), pas besoin de gérer les events du BindingNavigator.

    Les actions liées au changement de ligne dans le DGV doivent être exécutées depuis l'event RowEnter du DGV.

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Merci Graffito pour ta réponse.

    A peu près au même moment où tu me répondais je trouvais le coeur de la solution (concernant la non mise à jour de l'apparence des boutons du BN lorsque je passe par le clavier ou la souris pour naviguer dans le DG) :

    Il faut en fait écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurMa_DG = CType(Me.BindingContext(DGBindingSource), CurrencyManager)
    En revanche, je ne suis pas convaincu par l'event RowEnter et ce n'est pas faute d'avoir exploré ta piste. Le pb est que les événements Click de MoveNext, MoveLast, MovePrevious, MoveFirst ne déclenche pas en soi l'événement RowEnter du DG. J'ai d'ailleurs découvert à mes dépens que la mise à jour de la position du CurrencyManager se fait bien automatiquement lorsque l'un de ces 4 événements est déclenché, mais uniquement après le End Sub associé.
    Moyennant adaptation de mon code, j'ai donc pu régler mon problème.

    Exemple pour l'événement KeyUp du DG :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     Private Sub DG_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DG_CaveListeContenu.KeyUp
            Dim index As Integer
            Dim firstscrollindex As Integer
     
            index = Me.DG.CurrentRow.Index
            firstscrollindex = Min(Me.DG.FirstDisplayedScrollingRowIndex, index)
            BN_PositionItem.Text = index + 1
            Me.CurMa_DG.Position = index
            Me.DG.Rows(index).Selected = True
            Me.DG.CurrentCell = Me.DG.Rows(index).Cells(1)
            Me.DG.FirstDisplayedScrollingRowIndex = firstscrollindex
     
        End Sub
    et pour MoveNext :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub BN_MoveNextItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BN_MoveNextItem.Click
            Dim index As Integer
            Dim firstscrollindex As Integer
     
            index = CurMa_DG.Position + 1
            firstscrollindex = Min(Max(Me.DG.FirstDisplayedScrollingRowIndex, index - 9), index)
            Me.DG.Rows(index).Selected = True
            Me.DG.CurrentCell = Me.DG.Rows(index).Cells(1)
            Me.DG.FirstDisplayedScrollingRowIndex = firstscrollindex
     
     End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/01/2013, 01h00
  2. Probleme binding navigator
    Par theoffss dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/07/2008, 15h35
  3. Binding Navigator avancé
    Par infotunis dans le forum C#
    Réponses: 10
    Dernier message: 07/07/2008, 15h17
  4. Réponses: 2
    Dernier message: 21/08/2006, 21h27

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