/// <summary>
/// NullDateTimePicker에 대한 요약 설명입니다.
/// </summary>
public class NullDateTimePicker : System.Windows.Forms.DateTimePicker
{
private struct HANDLE
{
public IntPtr PtrHwnd;
public int IdFrom;
public int Code;
}
private bool isNULL;
private string nullValue = string.Empty;
private DateTimePickerFormat format = DateTimePickerFormat.Long;
private string customFormat = string.Empty;
private string formatAsString = string.Empty;
public NullDateTimePicker() : base()
{
base.Format = DateTimePickerFormat.Custom;
NullValue = "";
Format = DateTimePickerFormat.Long;
SetToNullValue();
}
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;
}
}
}
public new DateTimePickerFormat Format
{
get { return format; }
set
{
format = value;
if (!isNULL) SetFormat();
OnFormatChanged(EventArgs.Empty);
}
}
public new String CustomFormat
{
get { return customFormat; }
set { customFormat = value; }
}
public String NullValue
{
get { return nullValue; }
set { nullValue = value; }
}
private string FormatAsString
{
get { return formatAsString; }
set
{
formatAsString = value;
base.CustomFormat = value;
}
}
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;
}
}
private void SetToNullValue()
{
isNULL = true;
base.CustomFormat = (nullValue == null || nullValue == string.Empty) ? " " : "'" + nullValue + "'";
}
private void SetToDateTimeValue()
{
if (isNULL)
{
SetFormat();
isNULL = false;
base.OnValueChanged(new EventArgs());
}
}
protected override void WndProc(ref Message m)
{
if (isNULL)
{
if (m.Msg == 0x4e)
{
HANDLE nm = (HANDLE)m.GetLParam(typeof(HANDLE));
if (nm.Code == -746 || nm.Code == -722) SetToDateTimeValue();
}
}
base.WndProc(ref m);
}
protected override void OnKeyUp(KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
{
this.Value = null;
OnValueChanged(EventArgs.Empty);
}
base.OnKeyUp(e);
}
protected override void OnValueChanged(EventArgs eventargs)
{
base.OnValueChanged(eventargs);
}
}
'Program > C#' 카테고리의 다른 글
타임 서버에서 데이터 받아오기 (0) | 2010.03.19 |
---|---|
C#에서 ActiveX 사용하기 (0) | 2010.03.19 |
WebClient 클래스를 이용한 파일 다운로드 문제. (0) | 2010.03.19 |
한글키와 영문키 매치시키기. (0) | 2010.03.19 |
간단한 Developing Tips (0) | 2010.03.19 |