2014-01-24 2 views
0

데이터 바인딩 된 두 개의 텍스트 상자, 데이터 바인딩 된 DateTimePicker 및 BindingNavigator가있는 폼이 있습니다. 런타임에 이러한 구성 요소를 관련 데이터 소스에 바인딩합니다 (텍스트 상자의 '텍스트'및 '값'과 DateTimePicker는 각각 데이터 세트의 관련 필드에 바인드 됨). 모든 구성 요소는 현재 레코드를 올바르게 표시합니다. 일반적으로 네비게이터에서 "새 항목 추가"버튼을 클릭하면 모든 텍스트 상자가 지워지고 새 항목을 준비합니다. 그러나 DateTimePicker 바운드 될 때이 발생하지 않는 문제가 있고 더 나아가 데이터 집합을 업데이트하려고 시도하면 올바르게 발생하지 않습니다. DateTimePicker를 바인딩하지 않으면 예상대로 작동합니다. 이 행동의 원인은 무엇이며 주위에 방법이 있습니까?DateTimePicker 데이터 바인딩 끊기

답변

2

DateTimePicker는 Null 허용 데이터에 바인딩을 지원하지 않습니다. 새 행을 추가하면 해당 필드의 값은 기본적으로 DBNull.Value가되며 DateTimePicker의 Value 속성 인 DateTime 유형에 할당 할 수있는 값으로 성공적으로 변환 할 수 없습니다. DateTimePicker를 확장하고 DateTime 값과 DBNull 객체를 모두 지원하는 새 속성을 추가하고 바인드해야합니다. 그렇지 않으면 DateTimePicker에 항상 표시 할 DateTime이 있도록 DataColumn의 DefaultValue 속성을 설정해야합니다.

+0

확인. 그건 의미가 있습니다. 나는 다음과 같이 DateTimePicker를 확장하는 방법을 시도했다 : class NullableDateTimePicker : DateTimePicker { public DateTime NullableValue { get { return base.Value; } 집합 { if ((DateTime) value == null) base.Value = DateTime.Today; else base.Value = value; } } }하지만 문제가 남아 있습니다. –

+0

DateTime 유형의 다른 속성을 선언 할 시점이 없기 때문에 이것이 DateTimePicker.Value 속성의 첫 번째 문제입니다. 나는 다른 방법이 있는지 확신하지 못하지만, DateTime 값과 DBNull 객체를 모두 받아들이는 데 필요한 Object 유형의 속성을 사용하여이 작업을 수행하는 것을 보았습니다. 데이터는 null이 아니며, 즉 객체가 아니라 데이터베이스 null을 나타내는 DBNull 객체입니다. – jmcilhinney

+0

아, 이해합니다. 완벽하게 고마워요. –

0

이 문제는 단순히이 사이트를 기반으로 바인딩 소스의 addrow 방법을 제어하여 내 시나리오에 대한 해결되었습니다 : http://www.vbforums.com/showthread.php?645401-RESOLVED-datetimepicker-with-binding-source

바인딩 네비게이터에 새로운 버튼을 추가을 (당신의 '추가'로 사용) 및 제거 예전 것.

연결 클릭 이벤트에 새로운 행의 날짜 설정이 추가되는 : dbDateTime는 데이터베이스 필드입니다

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

.

클릭 이벤트에 코드를 추가해야 할 수도 있습니다 (예 : 데이터 그레이드에서 새로 추가 된 행으로 이동하는 경우).이 옵션은 구현하기가 훨씬 쉽습니다.