вторник, 15 апреля 2008 г.

Binding to DevExpress Grid

Столкнулся с проблемой биндинга DevExpress'овского грида: В качестве DataSource Grid'a был выставлен BindingDataSource, который в свою очередь, на DataSet. Строка таблицы в датасете  содержала AllowNull поля. Биндинг проходил удачно, все строки необходимой таблицы корректно попадали в грид, перемещение по строкам грида не вызывало проблем.  Но стоило только этому гриду потерять фокус, как выползал Exception: "The value for column XXX in table YYY is DBNull". "Как так!?" Спросил я. "Ведь я не пытаюсь получить доступ к этому полю, тем более при потере фокуса %)" После 4х часов "мучений" решением всему стал ответ группы поддержки DevExpress: "Thank you for the question. We have researched this problem and found out that this behavior is by design. This causes a situation that when the Grid is about to post data, it tries to obtain all values of the underlying object. This is done to provide the ability to rollback changes if there are any exceptions raised when posting data. However, you can easily bypass this problem by setting the GridView's OptionsBehavior.CacheValuesOnRowUpdating property to "Disabled". This way the Grid will not cache object values before posting data." Вобщем, то самое свойство, обеспечивающее возможность отката изменений, мне и недавало спокойно закончить поставленный таск =)

1 коммент.:

Dmitry комментирует...

Ты по умному решил вопрос )) А я пару дней назад аналогичную проблему решил путем привязки к гриду DataView:

DataView dataView = new DataView(sampleDataSet.SampleTable);
gridSample.DataSource = dataView;

Правда сам не понял, в чем фишка была, а тут девелоперы все объяснили, теперь ясно.