Search code examples
c#datetimecontrolspropertygrid

Choose time using datetimepicker in propertygrid


I am trying to pick only a time (hour and minutes) using propertygrid and datetimepicker.
I have created my own editor.
The trouble is that it is not showing the value in the text and the value can also have calendars:

Here have code:

public class Tests
    {
        private DateTimePicker time = new DateTimePicker();

        [Editor(typeof(MyEditor), typeof(UITypeEditor))]
        public DateTimePicker Time
        {
            get { return time; }
            set { time = value; }

        }

        public Tests()
        {
            time.Format = DateTimePickerFormat.Time;
            time.CustomFormat = "hh:mm";
            time.Value = DateTime.Now;
            DateTime t = new DateTime();

        }

    }

    class MyEditor : UITypeEditor
    {

        IWindowsFormsEditorService editorService;
        DateTimePicker picker = new DateTimePicker();

        public MyEditor()
        {

            picker.Format = DateTimePickerFormat.Custom;
            picker.CustomFormat = "hh:mm";
            picker.ShowUpDown = true;
            picker.ValueChanged += new EventHandler(picker_ValueChanged);
        }

        void picker_ValueChanged(object sender, EventArgs e)
        {
            this.editorService.CloseDropDown();
        }

        public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
        {

            if (provider != null)
            {
                this.editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
            }

            if (this.editorService != null)
            {

                DateTimePicker tmp = (DateTimePicker)value;
                tmp.CustomFormat = "hh:mm";
                tmp.Text = tmp.Value.ToString();
                picker = tmp;

                this.editorService.DropDownControl(picker);

            }

            return value;

        }

        public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.DropDown;
        }

    }

Solution

  • I finally did it by using strings

    public class Tests {
      private string time;
    
      [Editor(typeof(TimePickerEditor), typeof(UITypeEditor))]
      public string Time {
        get { return time; }
        set { time = value; }
      }
    
      internal class TimePickerEditor : UITypeEditor {
        IWindowsFormsEditorService editorService;
        DateTimePicker picker = new DateTimePicker();
        string time;
    
        public TimePickerEditor() {
          picker.Format = DateTimePickerFormat.Custom;
          picker.CustomFormat = "mm:HH";
          picker.ShowUpDown = true;
        }
    
        public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value) {
          if (provider != null) {
            this.editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
          }
          if (this.editorService != null) {
            if (value == null) {
              time = DateTime.Now.ToString("HH:mm");
            }
            this.editorService.DropDownControl(picker);
            value = picker.Value.ToString("HH:mm");
          }
          return value;
        }
    
        public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context) {
          return UITypeEditorEditStyle.DropDown;
        }
      }
    }