2010-12-16 6 views
3

Ich versuche, nur eine Zeit (Stunden und Minuten) mit propertygrid und datetimepicker auszuwählen.
Ich habe meinen eigenen Editor erstellt.
Das Problem ist, dass es nicht zeigt den Wert in dem Text und der Wert auch Kalender kann, haben:Wählen Sie Zeit mit datetimepicker in propertygrid

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

    } 

Antwort

4

Ich habe es schließlich mit Hilfe Saiten

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

Sie benötigen ein System.ComponentModel.TypeConverter, die zwischen Ihrem Objekt umwandelt implementiert und eine Zeichenfolge, anstatt die Zeichenfolge selbst zu verwenden. PropertyGrid verwendet TypeConverter Klassen intern ... obwohl es nicht sehr offensichtlich ist :)

+0

Ich bin vertraut mit Typeconverter und viel dann erstellt, doch ist diese Art und Weise ist ein wenig leichter. danke für die Eingaben – guyl