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

Windows Forms Discussion :

[C#][2.0]BindingSource et ComboBox. Event SelectedIndexChanged appelé plusieurs fois.


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut [C#][2.0]BindingSource et ComboBox. Event SelectedIndexChanged appelé plusieurs fois.
    Bonjour,

    j'ai développé une pop-up qui permet à l'utilisateur de retrouver un client.

    Sur cette pop-up, il y a un ComboBox dans lequel se trouve tous les clients.
    Lorsqu'il sélectionne le client, les produits attachés à ce client sont retrouvés dans la base de données.

    Ainsi sur l'évenement SelectedIndexChanged du combobox, je charge depuis la base de données les produits appartenant au client sélectionné.

    Lors de la première ouverture de la pop-up, lorsque l'utilisateur choisit un nouvel élément dans la ComboBox, l'évenement SelectedIndexChanged n'est déclenché qu'une seule fois.

    Si l'utilisateur referme la pop-up et la ré-ouvre, lors du changement dans la ComboBox, l'évenement SelectedIndexChanged est délcenché deux fois.

    Si je fais comme précedemment, l'évenement est déclenché trois fois, et ainsi de suite...

    Je ne comprends pas trop pourquoi.
    Voici mon code:

    Code c# : 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
     
    public class frmRechercheClientProduit:Form
    {
    /// <summary>
            /// Constructeur
            /// </summary>
            /// <param name="dsClient">DataSet du client</param>
            public frmRechercheClientProduit(RemoteAccess remoteAccess,
                BindingSource bdgSrcClient,
                BindingSource bdgSrcProduit)
            {
                InitializeComponent();
     
                // Initialisation de la liaison de données
                clientsBindingSource = bdgSrcClient;
     
                // Initialisation de la liaison de données des produits
                produitsBindingSource = bdgSrcProduit;
     
                // Initialisation de l'interface d'accès distant
                m_RemoteAccess = remoteAccess;
     
                // Initialisation de la liaison de données du ComboBox
                sTE_NOMComboBox.DataSource = clientsBindingSource;
     
                // Initialisation de la liaison de données de la ListBox
                listBoxProduits.DataSource = produitsBindingSource;
            }
    }
     
    /// <summary>
            /// Modification de la sélection du ComboBox
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void sTE_NOMComboBox_SelectedIndexChanged(object sender, EventArgs e)
            {
                LoadProducts(sTE_NOMComboBox.SelectedIndex);
            }
     
    /// <summary>
            /// Retrouve les produits associés à un client
            /// </summary>
            /// <param name="position"></param>
            private void LoadProducts(int position)
            {
                // Vérifie que l'index sélectionné se situe dans les limites acceptable par le CurrencyManager
                if ((clientsBindingSource.Count >= position)
                    && (position >= 0))
                {
                    // Définition de l'index
                    clientsBindingSource.Position = position;
     
                    // Objet courant sélectionné
                    DataRowView drvR = clientsBindingSource.Current as DataRowView;
     
                    // Le transtype peut être nul dans le cas l'objet n'est pas transtypable en DataRowView
                    if (drvR != null)
                    {
                        // Retrouve l'Identifiant du client sélectionné
                        int idClient = (int)drvR.Row["STE_ID"];
     
                        log.Debug("Chargement des produits");
     
                        // Retrouve dans la base de données les produits
                        produitsBindingSource.DataSource = m_RemoteAccess.GestionProduit.LoadProduitByClientId(idClient);
     
                        log.Debug("Produits chargés");
                    }
                }
            }

    Et pour appeler la pop-up:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    // Appel de la form permettant la sélection du client           
    using (frmRechercheClientProduit frm =
                    new frmRechercheClientProduit(m_RemoteAccess, ClientsBindingSource, ProduitsBindingSource))
                {
                    // Affichage de la form
                    frm.ShowDialog();
     
                    if (ClientsBindingSource.Current != null)
                    {
                             int idClient = 0;
                            DataRowView rView = ClientsBindingSource.Current as DataRowView;
                    }
     
                }

    A mon avis, ça doit être lié à l'utilisation des BindingSource.

    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonjour,

    personne n'a d'idée ?
    Le message n'est peut-être pas suffisamment clair ?
    En fait, je me demande si la pop-up est correctement détruite lors de la fermeture, car j'ai l'impression que lors d'une deuxième ouverture de cette pop-up l'ancienne réside toujours en mémoire. Cela doit être dû au fait que je copie la référence des BindingSource Clients et Produits. Lors de la fermeture de la pop-up ces références existent toujours et l'empêchent d'être détruite correctement. J'explique ceci ainsi. Je ne suis pas sûr d'avoir été bien clair.
    Si vous avez réussi à me comprendren, qu'en pensez-vous ?

    Merci d'avance.

  3. #3
    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
    Salut,

    je suis désolé mais je ne maîtrise pas bien le c# alors je vais te poser deux questions peut-être un peu à côté ...

    Tout d'abord, pourquoi ton form hérite de UserControl ?
    Ensuite (et surtout) , où est-ce que tu relies sTE_NOMComboBox_SelectedIndexChanged à l'événement SelectedIndexChanged de sTE_NOMComboBox ?

  4. #4
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonjour,

    et merci de ta réponse.

    Tout d'abord, pourquoi ton form hérite de UserControl ?
    Je me suis trompé dans mes copies/collés. J'avais crée initialement un usercontrol et ensuite une form. Je vais modifier ça tout de suite.

    où est-ce que tu relies sTE_NOMComboBox_SelectedIndexChanged à l'événement SelectedIndexChanged de sTE_NOMComboBox ?
    Cela est fait par le Designer de Visual Studio. Oui désolé, ça n'apparaît pas dans le code fourni.

    Petite précision. J'ai fait quelques essais et je me suis aperçu que dans le constructeur, si j'initialise les DataSource des BindingSource plutôt que les BindingSource eux-même, mon évenement de sélection d'index n'est appelé qu'une seule fois.

    Code c# : 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
    public frmRechercheClientProduit(RemoteAccess remoteAccess,
                BindingSource bdgSrcClient,
                BindingSource bdgSrcProduit)
            {
                InitializeComponent();
     
                // Initialisation de l'interface d'accès distant
                m_RemoteAccess = remoteAccess;
     
                // Initialisation de la liaison de données
                clientsBindingSource.DataSource = bdgSrcClient.DataSource;
     
                // Initialisation de la liaison de données des produits
                produitsBindingSource.DataSource = bdgSrcProduit.DataSource;
     
                // Le ComboBox et la liste sont liés respectivement à clientsBindingSource et produitsBindingSource. Ces liaisons sont fait dans le Designer.
     
            }

    Mais évidemment, le client sélectionné dans la pop-up n'est pas mis à jour du côté appelant.

    Merci d'avance.

  5. #5
    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
    Citation Envoyé par Pilloutou
    Mais évidemment, le client sélectionné dans la pop-up n'est pas mis à jour du côté appelant.
    Ecrase le BindinContext de ta poppup avec le BindingContext du form qui contient bdgSrcClient avant d'intialiser clientsBindingSource.

  6. #6
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonjour,

    Ecrase le BindinContext de ta poppup avec le BindingContext du form qui contient bdgSrcClient avant d'intialiser clientsBindingSource
    Ce qui donnerait:

    Code c# : 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
    public frmRechercheClientProduit(RemoteAccess remoteAccess,
                BindingSource bdgSrcClient,
                BindingSource bdgSrcProduit,
                BindingContext bdgCtxt)
            {
                InitializeComponent();
     
                // Initialisation de l'interface d'accès distant
                m_RemoteAccess = remoteAccess;
     
                // Initialisation du BindingContext
                this.BindingContext = bdgCtxt;
     
                // Initialisation de la liaison de données
                clientsBindingSource.DataSource = bdgSrcClient.DataSource;
     
                // Initialisation de la liaison de données des produits
                produitsBindingSource.DataSource = bdgSrcProduit.DataSource;
     
                // Le ComboBox et la liste sont liés respectivement à clientsBindingSource et produitsBindingSource. Ces liaisons sont fait dans le Designer.
     
            }

    Et tu penses que cela suffit, ou je dois modifier la position du BindingContext ?
    Si je dois modifier la position, qu'est-ce que je précise comme DataSource

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.BindingContext["       "].Position = ....

    Merci d'avance.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/05/2014, 15h55
  2. Probléme récupérer texte <texblock> dans combobox + event IsMouseOver
    Par jerem3000 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 18/05/2010, 03h18
  3. ComboBox event SelectionChanged et valeur courante séléctionné
    Par SKone dans le forum Windows Presentation Foundation
    Réponses: 12
    Dernier message: 25/02/2009, 21h42
  4. Problème applet ComboBox Event ActionPerformed
    Par RodEpsi dans le forum Applets
    Réponses: 7
    Dernier message: 02/09/2008, 11h16
  5. Réponses: 4
    Dernier message: 06/04/2008, 15h10

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