2008-11-12 9 views
1

J'ai une application Windows Forms avec deux contrôles ListBox sur le même formulaire. Ils ont tous les deux leur SelectionMode défini sur 'MultiExtended'.La modification d'une sélection ListBox modifie la sélection d'autres ListBox. Que se passe-t-il?

Lorsque je change la sélection de l'un la sélection des autres changements.

Maintenant, je pensais avoir fait quelque chose de stupide avec mes gestionnaires SelectedIndexChanged, alors je les ai supprimés et les ai réécrits à partir de zéro, et j'ai eu le problème. J'ai donc créé une toute nouvelle application WinForms et j'ai fait glisser deux ListBox sur la surface des formulaires.

Dans le constructeur je les ai remplis avec les suivants.

List<Thing> data = new List<Thing>(); 

for (int i = 0; i < 50; i++) { 
     Thing temp = new Thing(); 
     temp.Letters = "abc " + i.ToString(); 
     temp.Id = i; 
     data.Add(temp); 
} 

listBox1.DataSource = data; 
listBox1.DisplayMember = "Letters"; 
listBox1.ValueMember = "Id"; 


List<Thing> data2 = new List<Thing>(); 

for (int i = 0; i < 50; i++) { 
    Thing temp = new Thing(); 
    temp.Letters = "abc " + i.ToString(); 
    temp.Id = i; 
    data2.Add(temp); 
} 

listBox2.DataSource = data2; 
listBox2.DisplayMember = "Letters"; 
listBox2.ValueMember = "Id"; 

Ensuite, j'ai construit et exécuté l'application.

Commencé à sélectionner des valeurs pour voir si les symptômes étaient présents. Et ils étaient!

Il s'agit littéralement de tout le code que j'ai ajouté au formulaire, je n'avais pas ajouté de gestionnaires d'événements, je l'ai essayé avec le paramètre SelectionMode défini sur 'One' et 'MultiExtended'. Est-ce que quelqu'un peut me donner une idée de pourquoi cela se passe-t-il?

Vive

Répondre

4

Ce n'est pas la liste qui stocke la position actuelle - c'est le CurrencyManager. Toutes les commandes (avec le même BindingContext) avec le même référence en tant que DataSource partageront un CurrencyManager. En utilisant différentes instances de liste, vous obtenez différentes instances CurrencyManager, et donc une position distincte.

Vous pouvez obtenir le même en utilisant simplement .ToList(), ou créer un nouveau List<T> avec le même contenu (selon votre message original), ou en affectant une nouvelle BindingContext à l'un des contrôles:

control.BindingContext = new BindingContext(); 
1

j'ai vécu la même chose quand je la même source de données sur les deux listes déroulantes, mais la création de deux sources de données égales résolu le problème pour moi. Je ne vois rien de mal avec votre code. Quelque chose de particulier avec la classe Thing? Ou est-ce que ça contient juste les deux membres Lettres et Id?

+0

Oui , Juste les deux membres. Une classe vraiment simple uniquement pour mon exemple. –

2

Je crois que vos deux contrôles partagent un CurrencyManager. Je ne suis pas sûr exactement pourquoi.
Pour contourner le problème, vous pouvez simplement remplir vos zones de liste avec des chaînes simples. Vous pouvez également essayer de créer des instances distinctes du composant BindingSource et les lier à celles-ci.

+0

Des conseils pour les amener à utiliser des modèles différents? –

+0

En fait, je ne sais pas comment ils partagent un. J'ai essayé un exemple simple comme Shaun Bowe, et la sélection de la liste de sélection semble indépendante. Pouvez-vous reproduire le problème à partir d'une solution propre? –

0

J'ai créé une nouvelle application de formulaires gagnants avec deux zones de liste. Ils se comportent comme je m'attendrais. Pouvez-vous poster le code complet? Voici mon code.

public partial class Form1 : Form 
{ 
public Form1() 
{ 
    InitializeComponent(); 
} 

private class Thing 
{ 
    public String Letters { get; set; } 
    public Int32 Id { get; set; } 
} 
private void Form1_Load(object sender, EventArgs e) 
{ 
    List<Thing> data = new List<Thing>(); 

    for (int i = 0; i < 50; i++) 
    { 
    Thing temp = new Thing(); 
    temp.Letters = "abc " + i.ToString(); 
    temp.Id = i; 
    data.Add(temp); 
    } 

    listBox1.DataSource = data; 
    listBox1.DisplayMember = "Letters"; 
    listBox1.ValueMember = "Id"; 


    List<Thing> data2 = new List<Thing>(); 

    for (int i = 0; i < 50; i++) 
    { 
    Thing temp = new Thing(); 
    temp.Letters = "abc " + i.ToString(); 
    temp.Id = i; 
    data2.Add(temp); 
    } 

    listBox2.DataSource = data2; 
    listBox2.DisplayMember = "Letters"; 
    listBox2.ValueMember = "Id"; 
} 

}

0

J'ai essayé de reproduire ce comportement sur ma propre machine et n'a pas pu le faire en cours d'exécution que le code de votre fourni.

0

Je me suis corrigé.

Dans une autre instance de VS dans une toute nouvelle solution, cela fonctionne comme prévu.

Dieu ne sais est ce que je l'ai fait pour lui faire faire ce qu'il fait

1

Et plus ...

J'ai finalement eu ot au fond de celui-ci.

Je liais les deux ListBoxes à la même liste.en changeant le code à

theListBox.DataSource = _contacts.Take(_contacts.Count).ToList(); 

le problème a été curcumventé.

Il semble que la référence à la liste stockée porte également toute information de liaison ou de sélection sur l'autre ListBox.

soyez prudent. ;)

Questions connexes