반응형

/// <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);
  }
 }

반응형

+ Recent posts