2009-02-02 5 views
7

Я, имеющий практически такую ​​же проблему, как это:Обновление DataBound ComboBox

C# Update combobox bound to generic list

Однако, я пытаюсь изменить отображаемые строки; не добавлять, удалять и не сортировать. Я попробовал решение BindingList, указанное в упомянутом вопросе, но это не помогло. Я вижу, что свойство DataSource от combobox корректно обновляется, когда я редактирую элементы, но содержимое, отображаемое в combobox, не относится к свойству DataSource.

мой код выглядит следующим образом:

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"; 

... 

Когда я пытаюсь обновить содержимое я делаю следующее:

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

EDIT ::

RefreshItems кажется частным методом , Я просто получаю сообщение об ошибке:

«„System.Windows.Forms.ListControl.RefreshItems()“недоступен из-за его уровня защиты»

ResetBindings не имеет никакого эффекта.

ответ

11

Если вы хотите изменить весь объект, что означает весь объект SearchData, тогда список привязки будет знать об этом изменении, и поэтому правильные события будут активированы внутри, а combobox будет обновляться. ОДНАКО, поскольку вы только обновляете одно свойство, список привязок не имеет представления о том, что что-то изменилось.

Что вам нужно сделать, так это иметь класс SearchData для реализации INotifyPropertyChanged. Вот краткий пример, я написал, чтобы продемонстрировать:

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; 


    } 

А вот некоторый код для проверки:

 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"; 
    } 

Поскольку мой класс в настоящее время реализует INotifyPropertyChanged, связывание список получает «уведомление», когда что-то меняется, и все это будет работать.

+0

я попытался около 13 различных методов, чтобы получить выпадающий на моей форме обновления, то наконец-то нашел это решение. Хорошо написано и работало как шарм. Благодаря! –

2

вместо SearchComboBox.Refresh();

попробовать SearchComboBox.RefreshItems();

или SearchComboBox.ResetBindings();

Я думаю, что это на самом деле тот, что вам нужно.

Доступ к документации для ее членов here.

+0

RefreshItems защищен – Maxence

2

Это старый пост, но это может быть полезно.

Я просто смотрел на одной и той же проблемы и обнаружили, что, если вы звоните ResetItem на BindingList объекта, с позиции измененных элементов, это внутреннее вызывает событие Itemchanged уведомления для вас вызывает список, чтобы обновить.

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

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