Debugging custom UITypeEditors
If you read this you’re probably gonna think: What a moron! Anyway, i’m sharing this in the hope that i’ll be the last to undergo the following. In order to test my custom UITypeEditor i did the following
- Create a UserControl
- Add a property to the control
- Add an Editor attribute to the property
- Build
- Drag a UserControl on the designer form
- Test via Visual Studio’s Property Window if the UITypeEditor works as expected
- Everytime i changed some code: Restart Visual Studio, load the project and repeat 6.
A tedious task to say the least. Yesterday i figured out that i could drag a PropertyGrid on the designer form, and set it’s SelectedObject property to a class with a property that uses the custom UITypeEditor; Instead of having to reload visual studio i can simply start a debug session, and click on the property in the PropertyGrid. Now it’s a breeze to develop custom UITypeEditors.
private void Form1_Load(object sender, EventArgs e)
{
// display an instance of PersonEntry,
// a class with a property that should use the custom UITypeEditor i want to test
this.propertyGrid1.SelectedObject = new PersonEntry(new Person("Tim", "Van Wassenhove"));
}
public class PersonEntry
{
...
// instruct the PropertyGrid to use my custom PersonUITypeEditor
[Editor(typeof(PersonUITypeEditor), typeof(UITypeEditor))]
public Person Person
{
get { return this.person; }
set { this.person = value; }
}
}
public class PersonUITypeEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
Person person = value as Person;
IWindowsFormsEditorService svc = context.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
if (svc != null)
{
using (PersonEditorForm personEditorForm = new PersonEditorForm(person))
{
if (svc.ShowDialog(personEditorForm) == DialogResult.OK)
{
return personEditorForm.Person;
}
}
}
return value;
}
}