Life is.

반응형

DateTimePicker의 경우 ToString() 문자열의 경우만 언어변환이 되고

출력되는 달력은 윈도우의 기본 언어를 바꾸기 전에는 전환되지 않는다

하면서 알게 된 각종 뻘짓들

DateTimePicker의 경우 ToString() 문자열의 경우만 언어변환이 되고
출력되는 달력은 윈도우의 기본 언어를 바꾸기 전에는 전환되지 않는다
하면서 알게 된 각종 뻘짓들


// 누군가 만든 DateTimePicker Null 값 삽입 클래스
// 디자이너에서 이걸 선언하면 되지만 사용할 일이 있을까
/// <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()
    {
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-Hans");
        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);
    }
}


반응형

'개발 > C#' 카테고리의 다른 글

단축키 구현  (0) 2018.09.11
ActiveForm 활용  (0) 2018.09.11
System.Globalization 관련 DateTime  (0) 2018.09.11
Combobox 에서 CheckBox 넣기  (0) 2018.09.11
마우스 커서 없애기  (0) 2018.09.11