Обновление bindingsource в в WinForms не обновляет сбора данных

я хочу отобразить пользовательскую коллекцию в DataGridView в приложении Windows Forms. Эта пользовательская коллекция реализует ICollection и IEnumerable. Я установил BindingSource, используя коллекцию в качестве .свойство DataSource. The DataGridView настроен на использование my BindingSource как это источник данных. Когда я добавляю новый элемент в коллекцию, используя BindingSource.Add() методом DataGridView обновления правильно с новым элементом. The BindingSource источник данных, с другой стороны, не:

MyCustomCollection myCollection = new MyCustomCollection();

myCollection.Add(myCustomObject1);
myCollection.Add(myCustomObject2);

myBindingSource.DataSource(myCollection);
myBindingSource.Add(myCustomObject3);

в выше кода внутренний список myBindingSource содержит правильное количество записей (3) и DataGridView также содержит три записи, но myCollection содержит только две записи. Я знаю, что изменение базовой коллекции myCollection не обновит BindingSource или DataGridView, а не BindingList<T>, но у меня сложилось впечатление, что обновление BindingSource непосредственно обеспечит обновление myCollection одновременно.

есть ли способ, чтобы использовать коллекцию, которая не BindingList<T> и обновите его при взаимодействии с BindingSource напрямую?

обновление: один из способов обновления данных по всем частям (Collection, BindingSource, DataGridView) заключается в следующем:

myCollection.Add(myCustomObject3);
myBindingSource.DataSource = null;
myBindingSource.DataSource = myCollection;

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

4 ответов


проблема в том, чтобы заполнить адаптер. Когда вы загружаете свою форму,заполнить - это сделано для вас. Просто убедитесь, что сделать заправку, а затем следить за сбросом привязки разместить любые изменения данных и сетка будет обновляться.

пример :

WorkTableAdapter.Insert(objData.XAttribute, "",
  objData.YAttribute,objLoanData.Amount_IsValid, DateTime.Now, DateTime.Now);
this.WorkTableAdapter.Fill(this.POCDataSet.Work);
this.WorkBindingSource.ResetBindings(false);

вам придется вручную вызвать ResetBindings() после изменения источника данных, если вы используете контейнер, который не может сделать это от вашего имени.

http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.resetbindings.aspx

заставляет элемент управления, привязанный к BindingSource, перечитывать все элементы в списке и обновлять их отображаемые значения.


сброс отдельного элемента работы!

мне не повезло .ResetBindings (false) и повторное назначение источника данных вызвали мерцание с накладными расходами potentiail, если часто изменяется только один элемент.

я попробовал встроенный механизм, используя PropertyChanged, но ничего не обновил.

сброс отдельного элемента с помощью ResetItem () работал!

        for (int i = 0; i < bindingSource1.Count; i++)
        {
            bindingSource1.ResetItem(i);   
        }

и даже лучше-если у вас есть событие обновления, прикрепленное к каждому элементу данных в bindningsource вы можете найти объект в источнике bindning и использовать индекс объекта для вызова ResetItem (idx)

в этом случае мои пользовательские события args содержит ключ словаря для объекта данных, содержащегося в отдельной коллекции. После объект находится в использовании bindningsource.IndexOf () обновляется индивидуально.

    void Value_PropertyChanged(object sender, RegisterEventArgs e)
    {

        var idx = bindingSource1.IndexOf(registers_ref[e.registerID]);
        if (idx>=0)
        {
            bindingSource1.ResetItem(idx);                
        }

    }

Я считаю, что я столкнулся с этой проблемой некоторое время назад - я сделал находку в файлах моего кода, и я думаю, что это решение, которое сработало для меня.

        // Applies pending changes to the underlying data source.
        this.bindingSource1.EndEdit();

Это было в контексте обработчика события click для кнопки Сохранить.