2010-12-16 37 views
3

propertygriddatetimepickerを使用して時間(時および分)のみを選択しようとしています。
自分のエディタを作成しました。プロパティグリッドで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

私は最終的に私はtypeConvertersに精通していますし、その後の多くを作成し、まだこの方法は少しある文字列に

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

を使用してそれをやりましたもっと簡単に。入力に感謝 – guyl

関連する問題