반응형
목차를 시작으로
솔루션
실장
포맷
값
이벤트
컨스트럭터
사용법
CSLA.NET 사용자에 대한 주의 처음에 .NET 부속의 Date Time Picker 컨트롤은 룩앤필은 매우 뛰어나지만 어떤 중요한 기능을 갖추지 못했습니다.Date Time Picker 컨트롤에는 null 값을 입력할 수 없습니다.그러므로 Date Time Picker 컨트롤을 데이터 셋으로 바인드하면 문제가 발생합니다.데이터베이스내에서는 null을 허용하는 Date Time 값이 자주 사용되기 때문입니다.이 문제를 피하기 위한 솔루션이 인터넷에서 몇 가지 발견되었지만 모두 약간의 문제가 있었습니다.Yet another Date Time... Slicker: Nils Jonsson이 작성한 이 컨트롤은 Date Time Picker의 CheckBox를 사용하여 null 값을 나타냅니다.저는 이 솔루션에 찬성하지 않습니다.Text Box 등과 일관된 동작으로 해야 한다고 생각하기 때문입니다.Text Box 내에 null 값을 표시할 때는 null임을 Check Box로 나타내지는 않습니다.그냥 아무 것도 표시하지 않을 뿐이에요.
Nullable Date Time Picker : Pham Minh Tri가 작성한 이 컨트롤은 다른 방법을 사용하며 null 값일 때는 빈 Date Time Picker를 보여줍니다.이 편이 좋다고는 생각합니다만, 이 컨트롤에는 몇 가지 문제가 있어, 생각한 대로의 동작을 하지 않았습니다.이 컨트롤을 TabPage에 배치해서 데이터 연결을 하려고 했는데 예외가 발생해 버렸습니다.이 컨트롤을 null값으로 초기화하면 반드시 다음 예외가 발생했습니다. ′An unhandled exception of type′System.ComponentModel.Win32Exception′ occurred in system.windows.forms.dl.′은 초기값으로 동작할 때 문제없이 유효하게 Date했습니다.
Nullable Date Time Picker : 이는 Alexander Shirshov가 만든 컨트롤입니다.Pham Minh Tri의 컨트롤과 많이 비슷하지만 이쪽이 문제는 적다고 할 수 있습니다.그러나 Tab Control 상에서 사용하면 똑같은 예외가 발생하였습니다.즉, 룩앤필은 좋아도 TabPage상에서 동작하지 않는 컨트롤밖에 없다는 것입니다.하지만 저는 대부분의 컨트롤들을 TabPage에 배치해서 사용하기 때문에 이 컨트롤들을 TabPage상에서 동작시킬 필요가 있었습니다.반환된 예외를 자세하게 조사하는 것부터 착수했습니다.조사를 해보다가 초기화를 할 때 DateTimePicker.Format 속성을 CustomFormat으로 변경하고 있다는 것을 알게 되었습니다.게다가 Brett Zimmerann에 의한 다음과 같은 설명을 찾아냈습니다.따라서 이러한 Nullable Date Time Picker 컨트롤의 동작을 기반으로 하면서도 문제가 발생하지 않도록 자체 Nullable Date Time Picker 컨트롤을 만들기로 했습니다.솔루션 이 Nullable Date Time Picker 컨트롤은 Date Time Picker 컨트롤을 상속받았으며 Date Time Picker의 좋은 점을 모두 상속받았습니다.기본 Date Time Picker의 Format 속성은 항상 Date Time Picker Format. Custom으로 설정하고 변경하지 않습니다(컨트롤을 TabPage 상에서 사용했을 때 예외를 피하기 위해).원본 DateTimPicker와 동일하게 포맷을 변경할 수 있도록 하기 위해 이 NullableDateTimePicker에서는 DateTimePicker의 Format 속성 및 CustomFormat 속성과 관련된 모든 것을 에뮬레이트해야 합니다.이 컨트롤의 구체적인 구현을 다음에 제시합니다.먼저 NullableDateTimePicker에서 사용되는 다양한 값을 저장하기 위한 프라이빗 필드를 몇 가지 새로 정의합니다.// true, when no date shall be displayed (empty DateTimePicker)
private bool _ isNull ;
// If _ isNull = true , this value is shown in the DTP
private string _ nullValue ;
// The format of the DateTimePicker control
private DateTimePickerFormat _ format = DateTimePickerFormat . Long ;
// The custom format of the DateTimePicker control
private string _ customFormat ;
// The format of the DateTimePicker control as string
privatestring _formatAsString; 이전에도 말했듯이 DateTimePicker부터는 Format 속성과 CustomFormat 속성을 사용할 수 없습니다.그 때문에, 이것들을 대신하는 새로운 속성을 실장할 필요가 있습니다.public new String CustomFormat
{
get { return _ customFormat ; }
set
{
_ customFormat = value ;
}
}
public new DateTimePickerFormat Format
{
get { return _ format ; }
set
{
_ format = value ;
SetFormat ( ) ;
OnFormatChanged ( EventArgs . Empty ) ;
}
} Format 속성 세터를 호출하면 새로운 DateTimePickerFormat의 값이 _value에 저장됩니다.여기서 Nullable Date Time Picker 포맷을 이 새로운 포맷으로 변경해야 합니다.이것은 Set Format() 메서드내에서 실시합니다.부모의 DateTimePicker의 Format 속성은 항상 DateTimePickerFormat.Custom으로 설정이 되어있기 때문에 자체 클래스의 Format값을 이 포맷을 나타내는 문자열에 매핑을 해줘야 됩니다.그러면 이 문자열을 기본으로 Date Time Picker 컨트롤의 Custom Format으로 설정할 수 있습니다.하지만 Date Time Picker Format 값을 지원하는 문자열 표현에 매핑을 하려면 어떻게 해야 합니다.그러기 위해서는, 현재의 CultureInfo를 취득할 필요가 있습니다.이 CultureInfo에서 각종 Date Time Picker Format을 지원하는 올바른 포맷 문자열을 반환하는 Date Time Format Info를 가져옵니다.private void SetFormat ( )
{
CultureInfo ci = Thread . CurrentThread . CurrentCulture ;
DateTimeFormatInfo dtf = ci . DateTimeFormat ;
switch ( _ format )
{
case DateTimePickerFormat . Long :
FormatAsString = dtf . LongDatePattern ;
break ;
case DateTimePickerFormat . Short :
FormatAsString = dtf . ShortDatePattern ;
break ;
case DateTimePickerFormat . Time :
FormatAsString = dtf . ShortTimePattern ;
break ;
case DateTimePickerFormat . Custom :
FormatAsString = this . CustomFormat ;
break ;
}
}}위의 메서드에서는 FormatAsString 포맷의 문자열 표현을 FormatAsString 속성에 할당하고 있습니다.이는 본고에서 작성한 컨트롤들의 개인 속성입니다.private string FormatAsString
{
get { return _ formatAsString ; }
set
{
_ formatAsString = value ;
base . CustomFormat = value ;
}
} FormatAsString 속성 세터에서는 포맷 문자열을 base.CustomFormat에 할당하고, 최종적으로 부모 DateTimePicker 클래스 포맷을 변경하고 있습니다.지금까지의 코드에서는, 포맷의 문제를 동명의 신규 속성의 그늘에 숨겼습니다.따라서 이 컨트롤의 사용자 쪽에서 보면 지금까지와 달라진 것은 없습니다.다음은 한 걸음 더 나아가서 Date Time 값뿐만 아니라 null 값도 설정할 수 있도록 새로운 Value 속성을 구현합니다.Value 속성 게터는 기본 컨트롤의 Value를 그대로 반환하거나 컨트롤이 null 값을 표시하면 null을 반환한다.세터는 값이 null 또는 DB Null.Value이면 Set To Null Value()를 호출하여 컨트롤을 null로 설정합니다.값이 Date Time값이면 기본 컨트롤들의 Value를 설정합니다.그리고 Date Time 값을 올바르게 표시하기 위해서 Set To Date Time Format()을 호출합니다.public new Object Value
{
get
{
if ( _ isNull )
return null ;
else
return base . Value ;
}
set
{
if ( value == null || value == DBNull . Value )
{
SetToNullValue ( ) ;
}
else
{
SetToDateTimeValue ( ) ;
base . Value = ( DateTime ) value ;
}
}
}} 컨트롤이 그때까지 null을 표시하고 있고, 다음에 DateTime 값을 표시해야 하는 경우 SetToDateTimeValue() 메서드는 SetFormat()을 호출하여 포맷을 현재 사용 중인 DateTimePickerFormat으로 설정하고, 이후에 OnValueChanged 이벤트를 호출하여 ValueChanged 이벤트를 호출하여 발생시킵니다.private void SetToDateTimeValue ( )
{
if ( _ isNull )
{
SetFormat ( ) ;
_ isNull = false ;
base . OnValueChanged ( new EventArgs ( )) ;
}
} Set To Null Value() 메서드는 컨트롤 내에 Date Time 값 대신 Null Value를 표시합니다.Null Value는 개발자가 설정할 수 있는 문자열 속성입니다.따라서 null인 경우에 빈 Date Time Picker를 표시할 수도 있고 정해진 문자열(
솔루션
실장
포맷
값
이벤트
컨스트럭터
사용법
CSLA.NET 사용자에 대한 주의 처음에 .NET 부속의 Date Time Picker 컨트롤은 룩앤필은 매우 뛰어나지만 어떤 중요한 기능을 갖추지 못했습니다.Date Time Picker 컨트롤에는 null 값을 입력할 수 없습니다.그러므로 Date Time Picker 컨트롤을 데이터 셋으로 바인드하면 문제가 발생합니다.데이터베이스내에서는 null을 허용하는 Date Time 값이 자주 사용되기 때문입니다.이 문제를 피하기 위한 솔루션이 인터넷에서 몇 가지 발견되었지만 모두 약간의 문제가 있었습니다.Yet another Date Time... Slicker: Nils Jonsson이 작성한 이 컨트롤은 Date Time Picker의 CheckBox를 사용하여 null 값을 나타냅니다.저는 이 솔루션에 찬성하지 않습니다.Text Box 등과 일관된 동작으로 해야 한다고 생각하기 때문입니다.Text Box 내에 null 값을 표시할 때는 null임을 Check Box로 나타내지는 않습니다.그냥 아무 것도 표시하지 않을 뿐이에요.
Nullable Date Time Picker : Pham Minh Tri가 작성한 이 컨트롤은 다른 방법을 사용하며 null 값일 때는 빈 Date Time Picker를 보여줍니다.이 편이 좋다고는 생각합니다만, 이 컨트롤에는 몇 가지 문제가 있어, 생각한 대로의 동작을 하지 않았습니다.이 컨트롤을 TabPage에 배치해서 데이터 연결을 하려고 했는데 예외가 발생해 버렸습니다.이 컨트롤을 null값으로 초기화하면 반드시 다음 예외가 발생했습니다. ′An unhandled exception of type′System.ComponentModel.Win32Exception′ occurred in system.windows.forms.dl.′은 초기값으로 동작할 때 문제없이 유효하게 Date했습니다.
Nullable Date Time Picker : 이는 Alexander Shirshov가 만든 컨트롤입니다.Pham Minh Tri의 컨트롤과 많이 비슷하지만 이쪽이 문제는 적다고 할 수 있습니다.그러나 Tab Control 상에서 사용하면 똑같은 예외가 발생하였습니다.즉, 룩앤필은 좋아도 TabPage상에서 동작하지 않는 컨트롤밖에 없다는 것입니다.하지만 저는 대부분의 컨트롤들을 TabPage에 배치해서 사용하기 때문에 이 컨트롤들을 TabPage상에서 동작시킬 필요가 있었습니다.반환된 예외를 자세하게 조사하는 것부터 착수했습니다.조사를 해보다가 초기화를 할 때 DateTimePicker.Format 속성을 CustomFormat으로 변경하고 있다는 것을 알게 되었습니다.게다가 Brett Zimmerann에 의한 다음과 같은 설명을 찾아냈습니다.따라서 이러한 Nullable Date Time Picker 컨트롤의 동작을 기반으로 하면서도 문제가 발생하지 않도록 자체 Nullable Date Time Picker 컨트롤을 만들기로 했습니다.솔루션 이 Nullable Date Time Picker 컨트롤은 Date Time Picker 컨트롤을 상속받았으며 Date Time Picker의 좋은 점을 모두 상속받았습니다.기본 Date Time Picker의 Format 속성은 항상 Date Time Picker Format. Custom으로 설정하고 변경하지 않습니다(컨트롤을 TabPage 상에서 사용했을 때 예외를 피하기 위해).원본 DateTimPicker와 동일하게 포맷을 변경할 수 있도록 하기 위해 이 NullableDateTimePicker에서는 DateTimePicker의 Format 속성 및 CustomFormat 속성과 관련된 모든 것을 에뮬레이트해야 합니다.이 컨트롤의 구체적인 구현을 다음에 제시합니다.먼저 NullableDateTimePicker에서 사용되는 다양한 값을 저장하기 위한 프라이빗 필드를 몇 가지 새로 정의합니다.// true, when no date shall be displayed (empty DateTimePicker)
private bool _ isNull ;
// If _ isNull = true , this value is shown in the DTP
private string _ nullValue ;
// The format of the DateTimePicker control
private DateTimePickerFormat _ format = DateTimePickerFormat . Long ;
// The custom format of the DateTimePicker control
private string _ customFormat ;
// The format of the DateTimePicker control as string
privatestring _formatAsString; 이전에도 말했듯이 DateTimePicker부터는 Format 속성과 CustomFormat 속성을 사용할 수 없습니다.그 때문에, 이것들을 대신하는 새로운 속성을 실장할 필요가 있습니다.public new String CustomFormat
{
get { return _ customFormat ; }
set
{
_ customFormat = value ;
}
}
public new DateTimePickerFormat Format
{
get { return _ format ; }
set
{
_ format = value ;
SetFormat ( ) ;
OnFormatChanged ( EventArgs . Empty ) ;
}
} Format 속성 세터를 호출하면 새로운 DateTimePickerFormat의 값이 _value에 저장됩니다.여기서 Nullable Date Time Picker 포맷을 이 새로운 포맷으로 변경해야 합니다.이것은 Set Format() 메서드내에서 실시합니다.부모의 DateTimePicker의 Format 속성은 항상 DateTimePickerFormat.Custom으로 설정이 되어있기 때문에 자체 클래스의 Format값을 이 포맷을 나타내는 문자열에 매핑을 해줘야 됩니다.그러면 이 문자열을 기본으로 Date Time Picker 컨트롤의 Custom Format으로 설정할 수 있습니다.하지만 Date Time Picker Format 값을 지원하는 문자열 표현에 매핑을 하려면 어떻게 해야 합니다.그러기 위해서는, 현재의 CultureInfo를 취득할 필요가 있습니다.이 CultureInfo에서 각종 Date Time Picker Format을 지원하는 올바른 포맷 문자열을 반환하는 Date Time Format Info를 가져옵니다.private void SetFormat ( )
{
CultureInfo ci = Thread . CurrentThread . CurrentCulture ;
DateTimeFormatInfo dtf = ci . DateTimeFormat ;
switch ( _ format )
{
case DateTimePickerFormat . Long :
FormatAsString = dtf . LongDatePattern ;
break ;
case DateTimePickerFormat . Short :
FormatAsString = dtf . ShortDatePattern ;
break ;
case DateTimePickerFormat . Time :
FormatAsString = dtf . ShortTimePattern ;
break ;
case DateTimePickerFormat . Custom :
FormatAsString = this . CustomFormat ;
break ;
}
}}위의 메서드에서는 FormatAsString 포맷의 문자열 표현을 FormatAsString 속성에 할당하고 있습니다.이는 본고에서 작성한 컨트롤들의 개인 속성입니다.private string FormatAsString
{
get { return _ formatAsString ; }
set
{
_ formatAsString = value ;
base . CustomFormat = value ;
}
} FormatAsString 속성 세터에서는 포맷 문자열을 base.CustomFormat에 할당하고, 최종적으로 부모 DateTimePicker 클래스 포맷을 변경하고 있습니다.지금까지의 코드에서는, 포맷의 문제를 동명의 신규 속성의 그늘에 숨겼습니다.따라서 이 컨트롤의 사용자 쪽에서 보면 지금까지와 달라진 것은 없습니다.다음은 한 걸음 더 나아가서 Date Time 값뿐만 아니라 null 값도 설정할 수 있도록 새로운 Value 속성을 구현합니다.Value 속성 게터는 기본 컨트롤의 Value를 그대로 반환하거나 컨트롤이 null 값을 표시하면 null을 반환한다.세터는 값이 null 또는 DB Null.Value이면 Set To Null Value()를 호출하여 컨트롤을 null로 설정합니다.값이 Date Time값이면 기본 컨트롤들의 Value를 설정합니다.그리고 Date Time 값을 올바르게 표시하기 위해서 Set To Date Time Format()을 호출합니다.public new Object Value
{
get
{
if ( _ isNull )
return null ;
else
return base . Value ;
}
set
{
if ( value == null || value == DBNull . Value )
{
SetToNullValue ( ) ;
}
else
{
SetToDateTimeValue ( ) ;
base . Value = ( DateTime ) value ;
}
}
}} 컨트롤이 그때까지 null을 표시하고 있고, 다음에 DateTime 값을 표시해야 하는 경우 SetToDateTimeValue() 메서드는 SetFormat()을 호출하여 포맷을 현재 사용 중인 DateTimePickerFormat으로 설정하고, 이후에 OnValueChanged 이벤트를 호출하여 ValueChanged 이벤트를 호출하여 발생시킵니다.private void SetToDateTimeValue ( )
{
if ( _ isNull )
{
SetFormat ( ) ;
_ isNull = false ;
base . OnValueChanged ( new EventArgs ( )) ;
}
} Set To Null Value() 메서드는 컨트롤 내에 Date Time 값 대신 Null Value를 표시합니다.Null Value는 개발자가 설정할 수 있는 문자열 속성입니다.따라서 null인 경우에 빈 Date Time Picker를 표시할 수도 있고 정해진 문자열(
반응형