Привязка данных сложнее, чем хотелось бы - PullRequest
1 голос
/ 14 апреля 2009

У меня есть форма, которая будет заполнена кучей информации из шаблона, а затем передана пользователю для заполнения остальных. Дело в том, что шаблон и объект, который содержит конечный результат, являются DataRows, потому что все они входят и выходят из базы данных (над которой у меня нет контроля над схемой), так что это кажется отличным местом, чтобы просто связать все элементы управления и заниматься более важными вещами, верно?

Я не могу заставить элементы управления правильно связываться, и это отчасти моя вина, потому что я хотел просто выбросить строку, чтобы она выяснила, какие столбцы из строки важны, и сохранить значения от них, поэтому Я часто выкидываю строки, в которых нет всех столбцов, ожидаемых элементами управления, и поэтому они выдают исключение. Но это отчасти я не знаю, кто виноват, потому что делает это:

inProductName.DataBindings.Add("Text", TemplateBinder, "ProductName");

где TemplateBinder - это объект BindingSource со свойством DataSource, установленным в значение DataRow, которое я хочу вывести, выдает исключение, когда я иду показывать форму. Не совсем уверен, что я должен делать по-другому - TemplateBinder не будет содержать никаких источников данных, пока я не получу строку шаблона, и если мне придется самому управлять связыванием вместо того, чтобы устанавливать их и забывать их в верхней части страницы, я не получить большую ценность от привязки.

И это всего лишь тест, чтобы увидеть, возможно ли то, что я пытаюсь сделать! Я пытаюсь передать BindingSource строку, содержащую значения, которые я хочу распространить в форму, приостановить привязку, отключить ее для пустой строки из таблицы, чтобы значения, которые я распространял, остались в свойствах, которые я связал, покажите форму, дайте пользователю заполнить ее, а затем снова включите связывание, чтобы связанные свойства в элементах управления перетекли в пустую строку, которую я установил как источник данных BindingSource. Я имею в виду, что это никак не сработает, потому что это будет слишком просто, но было бы неплохо, если бы я мог сделать это вместо своего старого способа, который включал в себя оператор переключения из 30 случаев.

Я не хочу заходить слишком далеко вниз по кроличьей норе. В Visual Studio есть заманчивая кнопка, которая говорит, что она просто все настроит автоматически, но у меня есть опыт работы с Visual Studio, который предполагает, что ей не понравится идея, что схема базы данных не будет изменена в Visual Studio. Кроме того, я понятия не имею, как получить гибкость, которую я (или, скорее, мои клиенты) требую от этой причудливой автоматической настройки (я даже не вижу, как программно связываться со строкой соединения). Код, вставленный мной в копию, вероятно, менее грех, чем уничтожение функций, потому что я внес радикальные изменения за кулисы, которые, как оказалось, сделали некоторые очень удобные функции неудобными. Copypasta может быть превращена в функцию намного быстрее, чем требуется, чтобы переписать все приложение. И что тогда, если база данных изменится? Кажется, что автоматический код предпочитает генерировать исключение вместо того, чтобы просто проглотить свою гордость и ничего не делать, если у него недостаточно информации, чтобы что-то сделать.

Итак, Stack Overflow, tl; dr: Я хочу, чтобы привязка данных работала для меня вместо того, чтобы заставлять меня выбрасывать все, что я сделал. Можно я?

1 Ответ

1 голос
/ 14 апреля 2009

Я ожидаю, что для этого вам нужно будет использовать DataRowView, а не DataRow; попробуйте получить это из DataView, а не DataTable. Вид по умолчанию table.DefaultView.

Для информации; причина, по которой он работает, когда вы используете DataTable в качестве источника привязки, заключается в том, что DataTable реализует IListSource и возвращает (из GetList()) представление по умолчанию - так что фактически, когда вы связываетесь с DataTable вы actaully в конечном итоге привязываетесь к представлению по умолчанию (DataView).

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