2008-11-06 7 views
2

J'ai deux ListBox qui sont databound à la même BindingList. Le problème est que lorsque vous modifiez l'élément sélectionné à partir de l'interface graphique, il modifie la position dans BindingList, puis BindingList signale à l'autre ListBox de modifier l'élément sélectionné.Liaison C#: comment désactiver le CurrencyManager dans BindingList afin que la position de l'élément actuel ne soit pas maintenue et ne soit pas signalée?

J'ai donc les deux éléments sélectionnés ListBoxes également synchronisés ce qui n'est pas bon pour moi. Je souhaite conserver la liste des éléments en synchronisation. sans la position du curseur. Comment désactiver ce curseur pour qu'il ne soit pas conservé?

exemple de code (juste ajouter deux ListBoxes au formulaire au moment de la conception et enregistrer les événements SelectedIndexChanged et enregistrer le bouton événement de clic avec un bouton):

public partial class Form1 : Form 
{ 
    BindingList<string> list = new BindingList<string>(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     list.Add("bla1"); 
     list.Add("bla2"); 
     list.Add("bla3"); 

     this.listBox1.DataSource = list; 
     this.listBox2.DataSource = list; 
    } 

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (listBox1.SelectedIndex != -1) 
      System.Diagnostics.Trace.WriteLine("ListBox1: " + listBox1.SelectedItem.ToString()); 
    } 

    private void listBox2_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (listBox2.SelectedIndex != -1) 
      System.Diagnostics.Trace.WriteLine("ListBox2: " + listBox2.SelectedItem.ToString()); 
    } 

    // Register this event to a button 
    private void button1_Click(object sender, EventArgs e) 
    { 
     list.Add("Test"); 
    } 
} 

Merci, --Ran. La déclaration de listBox1 et de listBox2 comme étant du type suivant semble aboutir au comportement souhaité:

+0

deux options: (1) ne pas combattre l'intention de conception du gestionnaire de devises et le faire d'une autre manière, ou (2) se familiariser intimement avec la façon dont le gestionnaire de devises fonctionne et trouver un moyen de contourner. bonne chance. –

Répondre

7

Ajouter cette ligne à Form_Load:

this.listBox1.BindingContext = new BindingContext();

+0

Wow, agréable et simple, merci! – Ran

2

class MyListBox: ListBox { 

    protected override void OnSelectedIndexChanged (EventArgs a) { 
     if (DataManager != null) { 
      DataManager.SuspendBinding(); 
     } 
    } 

} 

Cordialement, Tamberg

+0

Impressionnant, Merci. – Ran

+0

Bien que j'ai trouvé un problème ... Si vous ajoutez un élément à ListBinding alors il casse cette solution et il revient à fonctionner comme si elle n'avait pas cette priorité. Je l'ai ajouté à l'exemple de code pour que vous puissiez le voir. Merci. – Ran

+0

Salut, il peut y avoir une autre méthode OnXChanged que vous devez remplacer. Si cela ne vous aide pas, une approche différente pourrait impliquer l'encapsulation du CurrencyManager mais pour le moment je ne vois pas comment changer l'instance de CurrencyManager.Salutations – tamberg

0

Ma solution à ce problème est d'utiliser une liste normale au lieu du BindingList et il suffit d'appeler (avant le changement) sur l'objet formulaire: this.BindingContext [Votre liste ] .SuspendBinding(); et après la modification de la liste this.BindingContext [Your List] .ResumeBinding(); Ceci met à jour tous les contrôles bornés.

avis, il est également noté dans le MSDN link here:

« Si vous êtes lié à une source de données qui ne met pas en oeuvre l'interface IBindingList, comme un ArrayList, ne sera pas mis à jour les données du contrôle lié lorsque la Par exemple, si vous avez une zone de liste déroulante liée à une ArrayList et que des données sont ajoutées à ArrayList, ces nouveaux éléments n'apparaîtront pas dans la zone de liste déroulante, mais vous pouvez forcer la mise à jour de la zone de liste déroulante en appelant les méthodes SuspendBinding et ResumeBinding sur l'instance de la classe BindingContext à laquelle le contrôle est lié. "

Questions connexes