Обновление 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 для кнопки Сохранить.