Обновление 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