Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Nullable DateTimePicker - помогите довести до ума 
V
    Опции темы
IApple
Дата 2.4.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Искал Nullable DateTimePicker (в т.ч. и на этом форуме), ничего лечше, чем вот это не нашел
Код

    public class NDTP : System.Windows.Forms.DateTimePicker
    {
        private DateTime? nullableValue;

        public new DateTimePickerFormat Format
        {
            get {return base.Format;}
            set {
                base.Format = value;
                this.format = value;
            }
        }
        private DateTimePickerFormat format;

        public new string CustomFormat
        {
            get { return base.CustomFormat; }
            set {
                base.CustomFormat = value;
                this.customFormat = value;
            }
        }
        private string customFormat;

        [Browsable(false)]
        [DefaultValue(null)]
        public new DateTime? Value
        {
            get { return this.nullableValue; }
            set
            {
                this.nullableValue = value;

                if (value == null)
                {
                    base.Format = DateTimePickerFormat.Custom;
                    base.CustomFormat = " ";
                }
                else
                {
                    base.Format = this.format;
                    base.CustomFormat = this.customFormat;
                    base.Value = (DateTime)value;
                }
            }
        }

        protected override void OnValueChanged(EventArgs eventargs)
        {
            this.nullableValue = base.Value;
            base.OnValueChanged(eventargs);
        }

        protected override void OnGotFocus(EventArgs e)
        {
            if (this.nullableValue == null)  this.Value = DateTime.Now;
            base.OnGotFocus(e);
        }

        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                this.Value = null;
            }
            else
            {
                base.Format = this.format;
                base.CustomFormat = this.customFormat;
            }
            base.OnKeyDown(e);
        }
    }


но оно не совсем годится - как только получает фокус - сразу ставит текущую дату, а хотелось бы, чтобы это происходило только в случае реальной попытки пользователя ввести какую-то дату (напрямую или через DropDown). Кроме того, почему-то не всегда правильно отображает дату (когда реально Value == null - показывает предыдущую дату и наоборот, когда не null - показывает "ничего").
Помогите до ума довести...

PM MAIL   Вверх
IApple
Дата 25.4.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Нашел. Здесь http://www.codeproject.com/KB/selection/Nu...TimePicker.aspx Работающее воплощение, но Source там почемуто не скачивается, поэтому собрал компонент по кускам представленым автором в самом описании + доработки для Net 2.0 + предложения других из обсуждения. Заработало в студии 2005, биндится на таблички с датой, где бывает Null.
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Globalization;
using System.Threading;


    public class NullableDateTimePicker : DateTimePicker
    {
        public NullableDateTimePicker()
            : base()
        {
            base.Format = DateTimePickerFormat.Custom;
            NullValue = " ";
            this.Format = DateTimePickerFormat.Short;
            this.DataBindings.CollectionChanged += new CollectionChangeEventHandler(DataBindings_CollectionChanged);
        }

        // 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.Short;

        // The custom format of the DateTimePicker control
        private string _customFormat;

        // The format of the DateTimePicker control as string
        private string _formatAsString;

        public new String CustomFormat
        {
            get { return _customFormat; }
            set { _customFormat = value; }
        }

        public new DateTimePickerFormat Format
        {
            get { return _format; }
            set
            {
                _format = value;
                if (!_isNull)
                    SetFormat();
                OnFormatChanged(EventArgs.Empty);
            }
        }
        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 string FormatAsString
        {
            get { return _formatAsString; }
            set
            {
                _formatAsString = value;
                base.CustomFormat = value;
            }
        }
        public new DateTime? Value
        {
            get
            {
                if (_isNull)
                    return null;
                else
                    return base.Value;
            }
            set
            {
                if (value == null)
                {
                    SetToNullValue();
                }
                else
                {
                    SetToDateTimeValue();
                    base.Value = (DateTime)value;
                }
            }
        }

        private void SetToDateTimeValue()
        {
            if (_isNull)
            {
                SetFormat();
                _isNull = false;
                base.OnValueChanged(new EventArgs());
            }
        }
        private void SetToNullValue()
        {
            _isNull = true;
            base.CustomFormat = (_nullValue == null || _nullValue == String.Empty)
                                ? " " : "'" + NullValue + "'";
        }

        public String NullValue
        {
            get { return _nullValue; }
            set { _nullValue = value; }
        }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x4e)                         // WM_NOTIFY
            {
                NMHDR nm = (NMHDR)m.GetLParam(typeof(NMHDR));
                if (nm.Code == -746 || nm.Code == -722)  // DTN_CLOSEUP || DTN_?
                    SetToDateTimeValue();
            }
            base.WndProc(ref m);
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct NMHDR
        {
            public IntPtr HwndFrom;
            public int IdFrom;
            public int Code;
        }
        protected override void OnKeyUp(KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                //this.Value = _dateTimeNullValue;
                this.SetToNullValue();
                OnValueChanged(EventArgs.Empty);
            }
            base.OnKeyUp(e);
        }

        private void DataBindings_CollectionChanged(object sender,
                                         CollectionChangeEventArgs e)
        {
            if (e.Action == CollectionChangeAction.Add)
                this.DataBindings[this.DataBindings.Count - 1].Parse +=
                       new ConvertEventHandler(NullableDateTimePicker_Parse);
        }

        private void NullableDateTimePicker_Parse(object sender, ConvertEventArgs e)
        {
            //saves null values to the object
            if (_isNull)
                e.Value = null;
        }

        // This member overrides Control.OnKeyPress
        //
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (this.Value == null)
            {
                Char chr = e.KeyChar;
                if (Char.IsNumber(e.KeyChar))
                {
                    // Set the Value to todays date
                    this.Value = DateTime.Now;
                    // The following two lines forces the 
                    // focus from the hidden checkbox to the month field
                    if (!this.ShowCheckBox)
                    {
                        this.ShowCheckBox = true;
                        this.ShowCheckBox = false;
                    }
                    // Resend the key pressed
                    SendKeys.Send(chr.ToString());
                }
            }
            base.OnKeyPress(e);
        } // end OnKeyPress
    }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.