Лучший способ привязки элемента управления Winforms к типу NULL?
В настоящее время я использую привязку данных winforms для подключения формы редактирования данных. Я использую инфраструктуру netTiers через CodeSmith для создания моих объектов данных. Для полей базы данных, разрешающих null, он создает типы с нулевым значением. Я обнаружил, что использование winforms привязки данных к элементам управления не будет правильно привязываться к типам с возможностью NULL.
Я видел решения в Интернете, предлагающие, чтобы люди создавали новые классы текстовых полей, которые могут обрабатывать типы с нулевым значением, но это может быть болью, чтобы поменять местами текстовые поля на уже созданные формы.
Сначала я подумал, что было бы здорово использовать метод расширения для этого. В основном создание свойства расширения для класса текстового поля и привязка к нему. Из моего метода ограниченного расширения и выполнения проверки онлайн, похоже, вы не можете использовать свойство расширения. Насколько я могу судить, привязка должна быть через свойство, так как она должна иметь возможность получить или установить значение, чтобы метод расширения не работал.
Мне бы хотелось найти чистый способ модифицировать эти формы, используя что-то вроде методов расширения, но если мне нужно создать новые текстовые поля и элементы управления со списком, что бы я сделал.
Мой проект в настоящее время ограничен .Net 2.0 из-за требования запуска в Windows 2000.
Любые предложения?
Ответы
Ответ 1
В разделе комментариев упомянутой статьи один из плакатов предлагает простое решение.
Вместо привязки к:
textBox1.DataBindings.Add("Text", myClass, "MyTextProperty");
Связать с:
textBox1.DataBindings.Add("Text", myClass, "MyTextProperty", true, DataSourceUpdateMode.OnPropertyChanged, string.Empty);
Ответ 2
Я просто наткнулся на эту проблему сам и это настоящая головная боль.
Самое смешное в привязке типов с нулевым значением заключается в том, что DataGridView обрабатывает их без каких-либо проблем - это просто текстовые поля, которые вызывают проблемы.
Это довольно неприятно - даже кажется, что это предотвращает закрытие формы, когда у вас есть пустое значение в текстовом поле, и кажется, что вы также не можете от нее уйти.
Итак, это не отличный ответ, но мое предложение - попытаться придерживаться datagridviews для типов с нулевым значением в форме.
Другое предложение - использовать "поставщик расширителя", как предлагается здесь, хотя я еще не тестировал его:
РЕДАКТИРОВАТЬ: теперь загрузили образец кода на этой странице, и он работает BRILLIANTLY.
http://www.thejoyofcode.com/Databinding_and_Nullable_types_in_WinForms.NET.aspx
Ответ 3
Ох, противный... Я могу только подумать о нескольких путях для достижения этого, и ни один из них не станет тем, что я бы назвал идеальным.
-
Во-первых, написать оболочку для вашего объекта данных, которая содержит nullables, которая преобразует все значения nullables в пустые строки. Привяжите к вашему оберточному объекту.
-
Во-вторых, убедитесь, что все значения в вашей базе данных не являются нулевыми... снова, не идеальными
-
Третий, который вы уже решили, не является жизнеспособным в этой ситуации, заключается в том, что вы создаете пользовательский объект, который расширяет текстовое поле, чтобы добавить свойство, которое может связываться с нулевым значением.
-
Четвертый самый идеальный способ, о котором я мог думать, не представляется возможным. Создайте свойство расширения, которое позволит вам расширять все объекты текстового поля и связываться с ним, но в настоящее время не существует возможности расширения. Похоже, что это такая ситуация, когда этот тип функции особенно полезен в платформе .NET.