Свойство DataMember [ObjectName] не может быть найдено в DataSource

У меня есть бизнес-объект, состоящий из дочерних объектов.
Я использую привязку данных в Visual Studio 2008 для привязки к элементам управления в форме Windows.

Но я получаю указанную выше ошибку в методе InitializeComponent формы.

Допустим, у меня есть объект с именем ParentObject, который содержит общий список ChildListObject. ParentObject также имеет дочерний объект, который сам имеет дочерний объект. (т.е. ParentObject.ChildObject.ChildObject)

Я установил основной источник привязки:

BindingSource.Datasource = ParentObject

Я добавляю сетку и устанавливаю источник привязки:

GridBindingSource.Datasource = ParentObject

и установите для DataMember значение:

BindingSourceB.DataMember = "ChildListObject"

Теперь источник данных сетки установлен на GridBindingSource:

Me.MyDataGridView.DataSource = Me.GridBindingSource

Существуют также другие элементы управления, привязанные к свойствам ParentObject и ParentObject.ChildObject.

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

Я получаю ошибку (если я использую имена объектов в приведенном выше примере):

«Свойство DataMember ChildObject не может быть найдено в источнике данных»

Это не удается:

Me.MyDataGridView.DataSource = Me.GridBindingSource

Как ни странно, если я удалю ‹System.Diagnostics.DebuggerStepThrough()›, а затем, когда произойдет сбой, просто продолжите, все в порядке??? Но он все еще терпит неудачу во время выполнения.

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


Эта проблема, кажется, приходит и уходит. Если я просто продолжу после возникновения ошибки, программа успешно продолжит работу без проблем. Возможно ошибка в VS. Но во время выполнения ошибка все еще существует.

Что вызывает эту проблему? Как мне остановить это?


person ptutt    schedule 26.02.2009    source источник


Ответы (6)


Я провел несколько экспериментов по этому поводу. Проблема возникает только в этом случае, если у вас есть BaseForm и BindingSource на нем, если вы наследуете новую InheritedForm от этой BaseForm или
если у вас есть дополнительный источник привязки на InheritedForm, связанный с BindingSource (который унаследован BaseForm), который вы есть ошибка конструктора. У меня нет дизайнерского решения, но если вы просто проигнорируете и продолжите, все будет нормально, когда вы снова создадите проект, или вам придется установить член данных по коду.

person Cenk Taylan Düz    schedule 07.06.2011

Единственный обходной путь, который я нашел, сделать следующее:

  1. Удалить все столбцы из сетки
  2. Добавьте нужные столбцы обратно в сетку (это предотвратит удаление столбцов на следующем шаге).
  3. Удалить источник данных сетки
  4. Установите источник данных сетки в событии загрузки формы.
person ptutt    schedule 28.10.2009

Просто переместите код генерации в событие Form_Load следующим образом:

private void MainForm_Load(object sender, EventArgs e)
{
    Me.MyDataGridView.DataMember = "DataMember";
    Me.MyDataGridView.DataSource = "DataSource";
}
person Linh Lương    schedule 30.05.2011

Datamember должен быть строкой, определяющей, какое свойство списка вы хотите показать. Здесь не нужно.

Это имело бы смысл:

BindingSourceB.Datasource = ParentObject.ChildList;

Если вы привязываетесь к сетке, вы не устанавливаете Datamember. Просто установите источник данных, а затем используйте конструктор для настройки сетки.

GetType призван помочь дизайнеру. В свойствах дизайнера вы должны установить BindingSourceB в тип ChildListObject, а затем сделать то, что я сделал выше.

person gcores    schedule 26.02.2009
comment
извините, пример был немного неправильным. Я отредактировал и исправил. На самом деле не было никакого промежуточного объекта, только родительский объект, который содержит общий список дочерних объектов. Я не устанавливал свойство datamember в сетке. Но все равно спасибо за помощь. - person ptutt; 26.02.2009

У меня такая же проблема

Private WithEvents _model As MyModel

удалил WithEvents и все снова заработало

Private _model As MyModel
person Nick N.    schedule 12.09.2014

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

Это вызвано тем, что я удалил источники данных из своего проекта, но, я думаю, он не удалил весь код, стоящий за ними, автоматически.

person Pacific NorthWest    schedule 03.11.2016