2010-12-16 5 views
3

propertygriddatetimepicker을 사용하여 시간 (시 및 분) 만 선택하려고합니다.
나는 내 편집자를 만들었습니다.propertygrid에서 datetimepicker를 사용하여 시간 선택

다음

이 코드 : 당신은 개체 사이에 변환하는 System.ComponentModel.TypeConverter를 구현해야 할

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


문제는이 텍스트의 값을 표시하지 않고 값도 달력을 가질 수 있다는 것입니다 문자열 자체를 사용하는 대신 문자열. 그것은 매우 분명 :)하지 비록 PropertyGrid는 ... 내부 TypeConverter 클래스를 사용

드디어하여 문자열로 그것을했다
+0

내가 typeConverters 익숙하고 많이 만들어, 아직이 방법은 조금 더 쉽게. 입력에 감사드립니다. – guyl

관련 문제