Обновление базы данных с привязкой ComboBox - PullRequest
7 голосов
/ 02 февраля 2009

У меня практически такая же проблема, как эта:

C # Обновление комбинированного списка, привязанного к общему списку

Однако я пытаюсь изменить отображаемые строки; не добавлять, удалять или сортировать. Я пробовал решение BindingList, представленное в указанном вопросе, но оно не помогло. Я вижу, что свойство DataSource комбинированного списка корректно обновляется при редактировании элементов, но содержимое, отображаемое в комбинированном ящике, отличается от свойства 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 не имеет никакого эффекта.

Ответы [ 3 ]

11 голосов
/ 02 февраля 2009

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

Вам нужно, чтобы ваш класс 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, список привязок получает "уведомление", когда что-то меняется, и все это будет таким образом работать.

2 голосов
/ 09 марта 2012

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

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

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

mBindingList.ResetItem(idx); //raise Item changed event to update the list display
2 голосов
/ 02 февраля 2009

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

попробуй SearchComboBox.RefreshItems();

или SearchComboBox.ResetBindings();

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

Вы можете получить доступ к документации для его членов здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...