2010-12-16 3 views
3

Я пытаюсь выбрать только время (час и минуты), используя propertygrid и datetimepicker.
Я создал свой собственный редактор.
Проблема заключается в том, что он не показывает значение в тексте, а значение может также иметь календари:Выберите время, используя datetimepicker в propertygrid

Здесь есть код:

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

    } 

ответ

4

я, наконец, сделал это с помощью строки

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; 
    } 
    } 
} 
1

Вы должны реализующий System.ComponentModel.TypeConverter, который преобразует между объектом и строка, а не сама строка. PropertyGrid использует TypeConverter классы внутренне ... хотя это не очень очевидно :)

+0

Я знаком с typeConverters и создал много тогда, но этот путь немного более легко. поблагодарить за вклад – guyl 2010-12-16 14:40:23