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

  1. #1
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    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 actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    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 expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    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 actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    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 expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    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 actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    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.

  7. #7
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Salut,
    Citation Envoyé par Pilloutou
    Ce qui donnerait:

    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
    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.
     
            }
    Oui, ça ne fonctionne pas comme ça ?
    (\ _ /)
    (='.'=)
    (")-(")

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

    Oui, ça ne fonctionne pas comme ça ?
    Ca n'a pas l'air.
    Pour que ça fonctionne, j'ai dû faire la chose suivante:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    using (FormSearchClient frm = new FormSearchClient(m_RemoteAccess, dsClient, dsProduit, this.BindingContext))
    {
           frm.ShowDialog();
     
           ClientsBindingSource.Position = this.BindingContext[dsClient, "Clients"].Position;
     
           [..]
    }

    Pour info lors de l'initialisation du BindingSource,

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ClientsBindingSource.DataSource = clientDataSet;
    ClientsBindingSource.DataMember = "Clients";

    Merci d'avance pour votre aide.

  9. #9
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Citation Envoyé par Pilloutou
    Pour info lors de l'initialisation du BindingSource,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ClientsBindingSource.DataSource = clientDataSet;
    ClientsBindingSource.DataMember = "Clients";
    Ah, c'est important !
    En effet, lors de la liaison à une source de donnée dans un objet enfant d'un formulaire (ici un bindingSource), le bindingContext du formulaire vérifie au préalable si la source de donnée est déjà liée, c'est à dire si un BindingManagerBase existe pour cette source pour gérer la liaison à cette source, auquel cas il le renvoie (d'où l'intérêt de notre manip afin de bosser sur un seul et même currencyManager et donc éviter tout pb de synchro), sinon il le crée. Or une source est définie par un DataSource ET (le cas échéant) par un DataMember.

    Donc il faut faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                // Initialisation du BindingContext
                this.BindingContext = bdgCtxt;
     
                // Initialisation de la liaison de données
                CType(clientsBindingSource, ISupportInitialize).BeginInit;
                clientsBindingSource.DataSource = bdgSrcClient.DataSource;
                clientsBindingSource.DataMember= bdgSrcClient.DataMember;
                CType(clientsBindingSource, ISupportInitialize).EndInit
    (\ _ /)
    (='.'=)
    (")-(")

  10. #10
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonsoir,

    j'ai essayé mais cela ne semble pas fonctionner.
    Voici ce que j'ai fait:

    J'ai défini un UserControl pour la création de nouvelles commandes:
    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
     
    public partial class ucCreationCommande : UserControl
    {
            private BindingSource clientsBindingSource;
            private BindingSource produitsBindingSource;
     
            public ucCreationCommande()
            {
                    InitializeComponent();
            }
     
            public InitializeCreationCommande(ProduitDataSet dsProduit, ClientDataSet dsClient)
            {
                ((ISupportInitialize)clientsBindingSource).BeginInit();
                ((ISupportInitialize)produitsBindingSource).BeginInit();
     
                    // Initialisation de la liaison de données des clients
                    clientsBindingSource.DataSource = clientDataSet;
                    clientsBindingSource.DataMember = "Clients";       
     
                    // Initialisation de la liaison de données des produits
                    produitsBindingSource.DataSource = dsProduit;
                    produitsBindingSource.DataMember = "Produits";
     
                ((ISupportInitialize)clientBindingSource).EndInit();
                ((ISupportInitialize)produitsBindingSource).EndInit();    
            }
     
            /// <summary>
            /// Click sur le bouton de sélection du client
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param> 
            private void btnChoixClient_Click(object sender, EventArgs e)
            {
                // Appel de la form permettant la sélection du client           
                using (frmRechercheClientProduit frm =
                    new frmRechercheClientProduit(m_RemoteAccess, clientsBindingSource,produitsBindingSource,this.BindingContext))
                {
                    // Affichage de la form
                    frm.ShowDialog();
     
                    // Lors de l'appel à la Fenête de recherche, l'élément sélectionné
                    // est accessible par la propriété Current du BindingSource.
                    ClientDataSet.ClientsRow dRowClient = ((DataRowView)clientsBindingSource.Current).Row as ClientDataSet.ClientsRow;
     
                    // L'identifiant du client est "STE_ID".
                    // Cet élément est ensuite assigné à la propriété Tag du TextBox
                    // Cette propriété est liée au BindingSource de la commande
                    if (dRowClient != null)
                    {
                        txtNomClient.Tag = dRowClient.STE_ID;
                        txtNomClient.Text = dRowClient.STE_NOM;
                    }
                }
            }
    }

    et voici le code de frmRechercheClientProduit:

    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
     
            /// <summary>
            /// Constructeur
            /// </summary>
            public frmRechercheClientProduit(BindingSource clientBindingSource,
                BindingSource produitBindingSource,
                BindingContext bdgCtxt)
            {
                InitializeComponent();
     
                // Initialisation du BindingContext
                if (bdgCtxt != null)
                    this.BindingContext = bdgCtxt;
     
                // Initialisation de la liaison de données des clients et des produits
                ((ISupportInitialize)clientBindingSource).BeginInit();
                ((ISupportInitialize)produitBindingSource).BeginInit();
     
                cltsBindingSource.DataSource = clientBindingSource.DataSource;
                cltsBindingSource.DataMember = clientBindingSource.DataMember;
     
                // Initialisation de la liaison de données des produits
                pdtsBindingSource.DataSource = produitBindingSource.DataSource;
                pdtsBindingSource.DataMember = produitBindingSource.DataMember;
     
                ((ISupportInitialize)clientBindingSource).EndInit();
                ((ISupportInitialize)clientBindingSource).EndInit();
     
                sTE_NOMClientComboBox.SelectedIndex = this.cltsBindingSource.Position;
            }
     
            /// <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)
            {               
                    cltsBindingSource.Position = position;
            }

    Après l'appel de ShowDialog(), la position du BindingSource n'a pas été modifié.

    Merci d'avance pour votre aide.

  11. #11
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Essaie comme ceci pour être sûr d'avoir le bindingContext du form parent de ton userControl
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                // Appel de la form permettant la sélection du client           
                using (frmRechercheClientProduit frm =
                    new frmRechercheClientProduit(m_RemoteAccess, clientsBindingSource,produitsBindingSource,this.Parentform.BindingContext))
    (\ _ /)
    (='.'=)
    (")-(")

  12. #12
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonsoir,

    désolé mais cela ne fonctionne pas non plus.
    Ne devrai-je pas modifier la position du BindingContext à partir de sa propriété Position ?

    Merci d'avance.

  13. #13
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    BindingContext n'a pas de propriété position. Tu pensais à celle de l'objet CurrencyManager qu'il peut te renvoyer je suppose...

    Modifier une quelconque propriété position revient à se résigner à gérer soi-même la synchronisation entre deux sources différente alros qu'il serait plus efficace d'éliminer le problème d'une synchro en partageant tout simplement la même source.

    Pour partager la même source de donnée (ou plus exactement le même currencyManager associé à cette source), il faut utiliser un bindingContext commun.

    Le problème est que le bindingSource encapsule le currencyManager et sa source et que manifestement, il ne se réfère pas (en interne) au BindingContext du formulaire qui le contient...

    Par curiosité, regarde si tu peux écraser le bindingContext de ta popup avant l'appel de son Initializecomponent et si ça fonctionne.

    Sinon il reste comme solution d'utiliser le même bindingSource dans ta combobox que celui qui est passé en paramètre du constructeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaCombo.DataSource = bindingSourcePasséEnParamètre
    Et en dernier recours, il te reste à gérer toi même la synchronisation en jouant avec les propriété position de tes différents BindingSource (moi je n'aime pas cette solution)...
    (\ _ /)
    (='.'=)
    (")-(")

  14. #14
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonsoir,

    et merci pour cette nouvelle réponse.
    BindingContext n'a pas de propriété position. Tu pensais à celle de l'objet CurrencyManager qu'il peut te renvoyer je suppose...
    Oui, autant pour moi.

    Le problème est que le bindingSource encapsule le currencyManager et sa source et que manifestement
    Je te remercie pour cette info, je n'avais pas pas compris ça du BindingSource.

    Sinon il reste comme solution d'utiliser le même bindingSource dans ta combobox que celui qui est passé en paramètre du constructeur.
    J'ai essayé mais cela provoque le même problème initial.
    En faisant:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    MaCombo.DataSource = bindingSourcePasséEnParamètre
    le bindingSource reste référencer par le DataSource du ComboBox et la pop-up une fois fermé n'est pas totalement détruite.
    Ainsi lors d'un nouvel appel à cette pop-up, les composants sont de nouveaux initialisés et un abonnement a de nouveau lieu sur l'évenement SelectedIndexChanged du ComboBox. Ainsi à chaque nouvelle ouverture de la pop-up, lors du changement d'index, la méthode est appelé une fois de plus.

    Et en dernier recours, il te reste à gérer toi même la synchronisation en jouant avec les propriété position de tes différents BindingSource (moi je n'aime pas cette solution)...
    Perso, je n'aime pas trop non plus. J'aimerais bien m'en passer.

    Tu as essayé chez toi ? Ca fonctionne ?
    Apparemment, cela devrait fonctionner aussi chez moi, non ?

    Merci d'avance

  15. #15
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Citation Envoyé par Pilloutou
    la pop-up une fois fermé n'est pas totalement détruite.
    Ainsi lors d'un nouvel appel à cette pop-up, les composants sont de nouveaux initialisés et un abonnement a de nouveau lieu sur l'évenement SelectedIndexChanged du ComboBox. Ainsi à chaque nouvelle ouverture de la pop-up, lors du changement d'index, la méthode est appelé une fois de plus.
    J'avait fait la même analyse du problème. Pour le régler, il suffirait théoriquement d'appler la méthode Dispose de ta popup. Ce que je ne comprend pas, c'est que USING est censé le faire !

    Sinon, pour les tests, malheureusement, je n'ai pas de quoi tester car je ne suis pas sur mon PC...

    As-tu essayé d'écraser le BindingContext avant d'initialiser les composants de ta popup ? Si ça ne fonctionne pas cela voudra dire que les bindingSources gèrent leur CurrencyManager sans passer par le BindingContext de leur conteneur.


    EDIT : au fait, ça ne change rien au pb, mais soit dit en passant si tu utilises la même source de donnée gérée par un même CurrencyManager, alors cette ligne est inutile dans ta popup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sTE_NOMClientComboBox.SelectedIndex = this.cltsBindingSource.Position;
    (pas besoin de synchro)

    EDIT 2 : pour résumer ton pb, je dirais qu'il y a deux aspects à régler :
    1. travailler sur une même liaison à ta source de donnée (pour pas avoir de synchro à gérer)
    2. bien détruire ta popup ou gérer les événements sur ta comoBox afin d'éliminer le problème de départ.
    (\ _ /)
    (='.'=)
    (")-(")

  16. #16
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    il suffirait théoriquement d'appler la méthode Dispose de ta popup. Ce que je ne comprend pas, c'est que USING est censé le faire
    Effectivement, using est censé le faire.
    J'ai même tenté de le faire manuellement, mais cela ne fonctionne pas mieux.
    J'ai même essayé sur l'evenement de fermeture de la pop-up de référencer à null le BindingSource que j'utilise mais à l'appel suivant de la pop-up, alors qu'un nouvel objet est réalloué au BindingSource, un message d'erreur m'indique que le BindingSource est nul.
    J'en ai conclu que tant qu'un objet est référencé, la pop-up n'est pas détruite.

    As-tu essayé d'écraser le BindingContext avant d'initialiser les composants de ta popup ?
    Oui j'ai essayé, j'ai fait ceci:

    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
    public frmRechercheClientProduit(RemoteAccess remoteAccess,
                BindingSource clientBindingSource,
                BindingSource produitBindingSource,
                BindingContext bdgCtxt)
            {
                // Initialisation de l'interface d'accès distant
                m_RemoteAccess = remoteAccess;
     
                // Initialisation du BindingContext
                this.BindingContext = bdgCtxt;
     
                InitializeComponent();
     
                // Initialisation de la liaison de données des clients et des produits
                ((ISupportInitialize)cltsBindingSource).BeginInit();
                ((ISupportInitialize)pdtsBindingSource).BeginInit();
     
                cltsBindingSource.DataSource = clientBindingSource.DataSource;
                cltsBindingSource.DataMember = clientBindingSource.DataMember;
     
                pdtsBindingSource.DataSource = produitBindingSource.DataSource;
                pdtsBindingSource.DataMember = produitBindingSource.DataMember;
     
                ((ISupportInitialize)cltsBindingSource).EndInit();
                ((ISupportInitialize)pdtsBindingSource).EndInit();
     
                sTE_NOMComboBox.DataSource = cltsBindingSource;
                sTE_NOMComboBox.DisplayMember = "STE_NOM";
     
                sTE_NOMComboBox.SelectedIndex = this.cltsBindingSource.Position;
     
            }

    Mais ce n'est pas mieux.

    Merci encore.

  17. #17
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Bon, et si tu oublies tes Bindingsource, les liaisons en mode design de tes ComboBox, ainsi que la déclaration de sTE_NOMComboBox_SelectedIndexChanged en tant que gestionnaire d'événement ?

    Il te resterait à lier tes ComboBox à l'exécution :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sTE_NOMComboBox.DisplayMember = "STE_NOM";
    sTE_NOMComboBox.DataSource = cltsBindingSource;

    .... et enregistrer le délégué pour l'événement (= associer "manuellement" sTE_NOMComboBox_SelectedIndexChanged à l'événement)... En VB c'est AddHandler ...
    Tu peux même supprimer le délégué sur fermeture de ta popup : RemoveHandler en VB...
    (\ _ /)
    (='.'=)
    (")-(")

  18. #18
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonsoir,

    d'après toi, cette solution est mieux que de modifier la position du CurrencyManager que renvoie BindingContext ?

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

    Merci d'avance.

  19. #19
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Ben je la préfère parce qu'elle évite d'avoir à gérer la synchro. Dans le principe, c'est mieux.
    Maintenant, à toi de juger si en pratique dans ton projet, cette gestion est un meilleur compromis.

    Quoiqu'il en soit je ne vois pas en quoi l'un ou l'autre choix règle logiquement et proprement le pb de l'événement répété.
    (\ _ /)
    (='.'=)
    (")-(")

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

    Quoiqu'il en soit je ne vois pas en quoi l'un ou l'autre choix règle logiquement et proprement le pb de l'événement répété.
    Oui c'est juste.

    Il y aura moyen, lorsque tu pourras, que tu testes de ton côté ?

    Merci d'avance.
    Bye.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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