Autor Beitrag
Codeexplorer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Di 19.06.07 14:42 
Hallo alle zusammen,

Ich versuche gerade eine Uhrzeit im PropertyGrid editierbar zu machen. Es will mir aber nicht so
richtig gelingen.
Wenn ich einen DateTime-Wert übergebe, bekomme ich einen DateTimePicker mit Kalenderdarstellung.
Ich habe es nun folgendermaßen versucht:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
    public class MyTimePicker : System.Windows.Forms.DateTimePicker
    {
        public MyTimePicker()
        {
            Format = System.Windows.Forms.DateTimePickerFormat.Time ;
        }
    }

    //...

        [
        Browsable(true),
        CategoryAttribute("Analyse"),
        DescriptionAttribute("Probenzeit"),
        Editor(typeof(MyTimePicker), typeof(System.Drawing.Design.UITypeEditor)) 
        ]
        public DateTime Probenzeit
        {
            get { return (DateTime)parameters["Probenzeit"]; }
            set { parameters["Probenzeit"] = value; }
        }


Das lässt sich zwar kompilieren und ausführen, aber das PropertyGrid stellt im Probenzeit-Feld
keine Editierungshilfe zur Verfügung und lässt sich auch generell nicht mehr ändern. Liegt das
daran, dass MyTimePicker kein UITypeEditor ist?
Kann mir jemand einen Tipp geben, was ich hier ändern muss?
Danke im voraus!!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 19.06.07 15:47 
Du hast ja selbst schon erkannt, dass der Editor ein Nachfahre von UITypeEditor sein muss. Daraus muss doch aber folgen, dass der Editor überhaupt nicht visuell sondern nur eine Hilfsklasse ist, da UITypeEditor direkt von Object erbt. Das eigentliche Control kannst du dann in der EditValue-Methode per provider.DropDownControl anzeigen lassen, was du dir am Besten am wunderschönen Beispiel im SDK unter "UITypeEditor" genauer ansehen kannst.
Codeexplorer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Di 19.06.07 18:02 
Titel: Dank und Fortschritte
Vielen Dank für den Hinweis. Das Beispiel ist wirklich nicht schlecht.
Ich bin mittlerweile etwas weitergekommen:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
    public class MyTimePicker : System.Windows.Forms.DateTimePicker
    {
        public MyTimePicker()
        {
            Format = System.Windows.Forms.DateTimePickerFormat.Custom ;
            CustomFormat = "hh:mm:ss";
            ShowUpDown = true;
            Value = DateTime.Now;
        }
    }

    public class MyTimeEditor : System.Drawing.Design.UITypeEditor 
    {
        public MyTimeEditor()
        {  
        }

        public new System.Drawing.Design.UITypeEditorEditStyle GetEditStyle()
        {
            return System.Drawing.Design.UITypeEditorEditStyle.DropDown;   
        }

      
        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider,
            object value)
        {
            object returnValue = value;
            if (provider != null)
            {
                IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)
                provider.GetService(typeof(IWindowsFormsEditorService));
                if (edSvc != null)
                {
                    MyTimePicker uiEditor = new MyTimePicker();
                    edSvc.DropDownControl(uiEditor);
                    value = uiEditor.Value;
                }
            }
            return value;
        } 
    }

    //...

        [
        Browsable(true),
        CategoryAttribute("Analyse"),
        DescriptionAttribute("Probenzeit"),
        Editor(typeof(MyTimeEditor), typeof(System.Drawing.Design.UITypeEditor)) 
        ]
        public DateTime Probenzeit
        {
            get { return (DateTime)parameters["Probenzeit"]; }
            set { parameters["Probenzeit"] = value; }
        }


Es funktioniert auch schon - naja größtenteils jedenfalls. Die Up-Down-Pfeile werden noch nicht angezeigt.
Da muss ich wohl noch etwas weitersuchen...
Codeexplorer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Mi 20.06.07 11:40 
Titel: TypeConverter
Hmmmm,

nachdem ich eine von TypeConverter abgeleitete Klasse hinzugefügt habe,
(Ich geb´s zu, die war geklaut. Quelle: www.thescripts.com/forum/thread406593.html)
und diese in den Property-Attributen eingetragen habe, lässt sich der Wert zumindest editieren.

Die UpDown-Buttons erscheinen trotzdem nicht. Vermutlich, weil der TypeConverter den
DateTime-Wert in einen String umwandelt. Sie sind aber auch nicht erschienen bevor
ich den TypeConverter eingefügt habe. Liegt das möglicherweise daran, dass der
DateTimePicker im UpDown-Modus gar kein DropDownControl ist ??

Dann würde das Problem wohl hier liegen:

ausblenden C#-Quelltext
1:
edSvc.DropDownControl(uiEditor);					


Wie kann ich das Steuerelement denn sonst übergeben?
Oder liege ich mit meiner Vermutung ganz falsch?
Kann mir hier jemand weiterhelfen?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 20.06.07 18:13 
Äußerst deprimierend, wenn ein Problem nachstellen will, dann aber dieses überhaupt nicht auftaucht :cry: . Sieht jedenfalls alles gut aus, das UpDown-Feld erscheint.
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            propertyGrid1.SelectedObject = new Data(DateTime.Now);
        }
    }

 public class Data
    {
        private DateTime arrival;

        public Data(DateTime arrival)
        {
            this.arrival = arrival;
        }

        [Editor(typeof(TimeConverter), typeof(UITypeEditor))]
        public DateTime Arrival
        {
            get { return arrival; }
            set { arrival = value; }
        }
    }

class NothingHasChangedPicker : DateTimePicker
    {
        public NothingHasChangedPicker()
        {
            ShowUpDown = true;
        }
    }

    class TimeConverter : UITypeEditor
    {
        public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.DropDown;
        }

        public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
        {            
            if(!(value is DateTime))
                return value;

            IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            if( edSvc != null )
            {
                NothingHasChangedPicker picker = new NothingHasChangedPicker();
                edSvc.DropDownControl(picker);

                return picker.Value;
            }
            return value;
        }
Codeexplorer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Do 21.06.07 10:46 
:oops: Sebastian, du hast mich entlarvt. Ich muss zurück in die Grundschule für OO-Programmierer.
Ich habe Methode GetEditStyle mit new ausgeblendet, statt sie mit override zu erweitern !
Ich hoffe, ich habe Deine Hilfsbereitschaft nicht zu sehr überstrapaziert.
Ein kleiner Trost: es scheint noch ein paar Andere zu geben, die sich für
das Thema interessieren ...

Auf jeden Fall: Vielen Dank nochmal.

Oliver
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 21.06.07 13:39 
Ist doch nicht schlimm, ich habe diesen kleinen Fehler schließlich auch übersehen ;) . Und wenn ich einen doch nicht ganz kurzen Beispielcode programmiere, darfst du auch davon ausgehen, dass es mir Spaß gemacht hat. Mit System.ComponentModel hatte ich z.B. bis gestern noch nie herumgespielt, das durfte ja nicht so bleiben ^^ .