2009-04-14 6 views
1

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

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

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

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

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

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

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

ответ

1

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

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