Обновление ComboBox базы данных
у меня практически такая же проблема, как это:
C# Update combobox привязан к общему списку
однако я пытаюсь изменить отображаемые строки; не добавлять, удалять или сортировать. Я попробовал решение BindingList, предоставленное в указанном вопросе, но это не помогло. Я вижу, что свойство DataSource combobox правильно обновляется при редактировании элементов, но содержимое, отображаемое в combobox, не является таковым в источнике данных свойство.
мой код выглядит следующим образом:
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 кажется частным методом. Я просто получаю сообщение об ошибке:
"'.Окна.Формы.Элементе управления listcontrol.RefreshItems () 'недоступен из-за его уровня защиты"ResetBindings не имеет никакого эффекта.
3 ответов
Если вы должны были изменить весь объект, то есть весь объект SearchData, то bindinglist будет знать об этом изменении, и поэтому правильные события будут внутренне уволены, и combobox будет обновляться. Однако, поскольку вы обновляете только одно свойство, bindinglist понятия не имеет, что что-то изменилось.
что вам нужно сделать, это реализовать класс 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, список привязки получает "уведомление", когда что-то меняется, и все это будет работать.
вместо SearchComboBox.Refresh();
попробовать SearchComboBox.RefreshItems();
или SearchComboBox.ResetBindings();
Я думаю, что это действительно последняя, что вам нужно.
вы можете получить доступ к документации для его членов здесь.
Это старый пост, но это может быть полезно.
Я только что смотрел на ту же проблему и обнаружил, что если вы позвоните ResetItem
на BindingList
объект, с измененным положением элементов, он внутренний поднимает Itemchanged
событие уведомления для вас, вызывающее обновление списка.
int idx = SearchComboBox.SelectedIndex;
mBindingList[idx].Display = value;
mBindingList.ResetItem(idx); //raise Item changed event to update the list display