2014-01-24 2 views
0

У меня есть форма с двумя текстовыми полями, привязанными к данным, с привязкой к данным DateTimePicker и BindingNavigator. Я связываю эти компоненты во время выполнения с соответствующими источниками данных («Текст» и «Значение» текстовых полей и DateTimePicker почтительно связаны соответствующими полями в наборе данных). Все компоненты отображают текущие записи правильно. Обычно, когда вы нажимаете кнопку «Добавить новый элемент» в навигаторе, все текстовые поля очищаются при подготовке к новой записи. Однако у меня есть проблема, что это не происходит при привязке DateTimePicker, и, кроме того, любые попытки обновления наборов данных происходят неправильно. Если я не буду связывать DateTimePicker, тогда все будет работать так, как ожидалось. В чем причина такого поведения, и есть ли способ вокруг него?DateTimePicker разрыв привязки данных

ответ

2

DateTimePicker не поддерживает привязку к нулевым данным. Когда вы добавляете новую строку, значение для этого поля будет по умолчанию DBNull.Value и не может быть успешно преобразовано в значение, которое может быть присвоено свойству Value DateTimePicker, которое является типом DateTime. Вам нужно либо расширить DateTimePicker, либо добавить новое свойство, поддерживающее значения DateTime и объекты DBNull, и связать это или установить свойство DefaultValue вашего DataColumn, чтобы в DateTimePicker всегда отображалось DateTime.

+0

Хорошо. В этом есть смысл. Я попробовал метод расширения DateTimePicker следующим образом: 'класса NullableDateTimePicker: DateTimePicker { общественного DateTime NullableValue { получить { возвращение base.Value; } комплект { if ((DateTime) value == null) base.Value = DateTime.Today; еще base.Value = значение; } } } 'Но проблема остается. –

+0

Нет смысла объявлять другое свойство типа DateTime, потому что это проблема в первую очередь с свойством DateTimePicker.Value. Я не уверен, есть ли другой способ, но я уже видел это с использованием свойства типа Object, которое требуется для принятия как значений DateTime, так и объектов DBNull. Обратите внимание, что данные не будут нулевыми, то есть нет объекта, а скорее объектом DBNull, который представляет собой нулевые значения базы данных. – jmcilhinney

+0

А, я понимаю. Получил это, чтобы отлично работать. –

0

Эта проблема была решена для моего сценария, просто контролируя метод addrow источника связывания, основанного на этом сайте: http://www.vbforums.com/showthread.php?645401-RESOLVED-datetimepicker-with-binding-source

Добавить новую кнопку на связывающий навигаторе (для использования в качестве «Add») и удалить Старый.

Подключение к событию щелчка и установите DateTime новой строки добавляется:

DataRowView row = (DataRowView)bs_.AddNew(); 
row["dbDateTime"] = DateTime.Now; 

где dbDateTime это ваше поле базы данных.

Возможно, вам придется добавить еще один код в событие click, например, перемещение к недавно добавленной строке в datagrid, этот вариант был самым простым в реализации.

Смежные вопросы