2009-02-02 4 views
7

J'ai pratiquement le même problème que ceci:Mise à jour d'un ComboBox databound

C# Update combobox bound to generic list

Cependant, je suis en train de changer les chaînes affichées; ne pas ajouter, supprimer ou trier. J'ai essayé la solution BindingList fournie dans la question référencée, mais cela n'a pas aidé. Je peux voir que la propriété DataSource de la liste déroulante est correctement mise à jour lorsque j'édite les éléments, mais que le contenu affiché dans la liste déroulante n'est pas celui de la propriété DataSource.

mon code se présente comme suit:

mSearchComboData = new List<SearchData>(); 
mSearchComboData.Add(new SearchData("", StringTable.PatientID)); 
mSearchComboData.Add(new SearchData("", StringTable.LastName)); 
mSearchComboData.Add(new SearchData("", StringTable.LastPhysician)); 
mSearchComboData.Add(new SearchData("", StringTable.LastExamDate)); 

mBindingList = new BindingList<SearchData>(mSearchComboData); 

SearchComboBox.Items.Clear(); 
SearchComboBox.DataSource = mBindingList; 
SearchComboBox.ValueMember = "Value"; 
SearchComboBox.DisplayMember = "Display"; 

... 

Lorsque je tente de mettre à jour le contenu que je fais ce qui suit:

int idx = SearchComboBox.SelectedIndex; 
mBindingList[idx].Display = value; 
SearchComboBox.Refresh(); 

EDIT ::

RefreshItems semble être une méthode privée . Je viens de recevoir le message d'erreur:

" 'System.Windows.Forms.ListControl.RefreshItems()' est inaccessible en raison de son niveau de protection"

ResetBindings n'a pas d'effet.

Répondre

11

Si vous deviez modifier l'objet entier, c'est-à-dire l'ensemble de votre objet SearchData, la liste de liens aurait connaissance de cette modification et donc les événements corrects seraient déclenchés, et la liste déroulante serait mise à jour. Cependant, puisque vous ne mettez à jour qu'une seule propriété, la liste de liens n'a aucune idée que quelque chose a changé.

Ce que vous devez faire, c'est que votre classe SearchData implémente INotifyPropertyChanged. Voici un exemple rapide je l'ai écrit pour démontrer:

public class Dude : INotifyPropertyChanged 
    { 
     private string name; 
     private int age; 

     public int Age 
     { 
      get { return this.Age; } 
      set 
      { 
       this.age = value; 
       if (this.PropertyChanged != null) 
       { 
        this.PropertyChanged(this, new PropertyChangedEventArgs("Age")); 
       } 
      } 
     } 
     public string Name 
     { 
      get 
      { 
       return this.name; 
      } 

      set 
      { 
       this.name = value; 
       if (this.PropertyChanged != null) 
       { 
        this.PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 


    } 

Et voici un code à tester:

 private void button1_Click(object sender, EventArgs e) 
     { 
      //Populate the list and binding list with some random data 
      List<Dude> dudes = new List<Dude>(); 
      dudes.Add(new Dude { Name = "Alex", Age = 27 }); 
      dudes.Add(new Dude { Name = "Mike", Age = 37 }); 
      dudes.Add(new Dude { Name = "Bob", Age = 21 }); 
      dudes.Add(new Dude { Name = "Joe", Age = 22 }); 

      this.bindingList = new BindingList<Dude>(dudes); 
      this.comboBox1.DataSource = bindingList; 
      this.comboBox1.DisplayMember = "Name"; 
      this.comboBox1.ValueMember = "Age"; 

     } 


    private void button3_Click(object sender, EventArgs e) 
    { 
     //change selected index to some random garbage 
     this.bindingList[this.comboBox1.SelectedIndex].Name = "Whatever"; 
    } 

Depuis ma classe implémente maintenant INotifyPropertyChanged, la liste de liaison se « notifié » quand quelque chose change, et tout cela va donc fonctionner.

+0

j'avais essayé sur 13 différentes méthodes pour obtenir le combobox sur mon formulaire à jour, puis enfin trouvé cette solution. Bien écrit, et travaillé comme un charme. Merci! –

2

au lieu de SearchComboBox.Refresh();

essayer SearchComboBox.RefreshItems();

ou SearchComboBox.ResetBindings();

Je pense qu'il est vraiment celui-ci que vous avez besoin.

Vous pouvez accéder à la documentation de ses membres here.

+0

RefreshItems est protégé – Maxence

2

Ceci est un ancien article, mais cela peut être utile.

Je viens de regardé le même problème et nous avons trouvé que si vous appelez ResetItem sur l'objet BindingList, avec la position des éléments modifiés, il interne déclenche l'événement de notification Itemchanged pour vous causer la liste mise à jour.

int idx = SearchComboBox.SelectedIndex; 
mBindingList[idx].Display = value; 

mBindingList.ResetItem(idx); //raise Item changed event to update the list display 
Questions connexes