PropertyGrid will use default editor for the properties which’s type is enum. This default editor does not allow multiple selections even the Enum has Flags attribute.
I have been prepared a new Editor for this kind of properties.
Our editor’s code is as follows;
internal class FlagsEditor : UITypeEditor
{
FlagsEditorControl editor = null;
public FlagsEditor()
{ }
// our editor is a Drop-down editor
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
// if value is not an enum than we can not edit it
if (!(value is Enum))
throw new Exception("Value doesn't support");
// try to figure out that is this a Flags enum or not ?
Type enumType = value.GetType();
object[] attributes = enumType.GetCustomAttributes(typeof(FlagsAttribute), true);
if (attributes.Length == 0)
throw new Exception("Editing enum hasn't got Flags attribute");
// check the underlying type
Type type = Enum.GetUnderlyingType(value.GetType());
if (type != typeof(byte) && type != typeof(sbyte) &&
type != typeof(short) && type != typeof(ushort) &&
type != typeof(int)&& type != typeof(uint))
return value;
if (provider != null)
{
// use windows forms editor service to show drop down
IWindowsFormsEditorService edSvc = provider.GetService(
typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
if (edSvc == null)
return value;
if (editor == null)
editor = new FlagsEditorControl(this);
// prepare list
editor.Begin(edSvc, value);
// show drop down now
edSvc.DropDownControl(editor);
// now we take the result
value = editor.Value;
// reset editor
editor.End();
}
return Convert.ChangeType(value, type);
}
}
In this code FlagsEditorControl is a UserControl which PropertyGrid hosts it in a drop down during the edit operation.
You can change your design by changing this Control.
To use this editor for a property, we have to write Editor Attribute to that property as the below;
// set editor of this property to our FlagsEditor
[Editor(typeof(FlagsEditor), typeof(UITypeEditor))]
public FileAttributes FlagsAttribute
{
get { return _FlagsAttribute; }
set { _FlagsAttribute = value; }
}