Показване само на някои от опциите на изброяване

Имам изброяване, показано в PropertyGrid:

private My_Enum _ee;

public My_Enum  EE
{
    get { return _ee; }
    set
    {
        _ee= value;
    }
}

public enum My_Enum 
{
    NUM1 = 0,
    NUM2 = 1,
    NUM3 = 2,
    NUM4 = 3,
    NUM5 = 4,
    NUM6 = 5,
    NUM7 = 6,
    DEF
};

Има ли начин да се покажат в PropertyGrid само две опции от enum (напр. NUM1, NUM2)?


person Hodaya Shalom    schedule 15.04.2013    source източник


Отговори (2)


проверете връзката по-долу, трябва да използвате TypeConverter

person Damith    schedule 15.04.2013

Можете да дефинирате атрибут, използван за маркиране на полето като специално, и след това да използвате персонализиран UITypeEditor, нещо подобно:

[Editor(typeof(MyEnumEditor), typeof(UITypeEditor))]
public enum My_Enum
{
    NUM1 = 0,
    NUM2 = 1,
    NUM3 = 2,
    [Browsable(false)]
    NUM4 = 3,
    NUM5 = 4,
    NUM6 = 5,
    NUM7 = 6,
    DEF
}

public class MyEnumEditor : UITypeEditor
{
    private IWindowsFormsEditorService _editorService;
    private bool _cancel;

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        _cancel = false;
        _editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
        ListBox listBox = new ListBox();
        listBox.IntegralHeight = true;
        listBox.SelectionMode = SelectionMode.One;
        listBox.MouseClick += OnListBoxMouseClick;
        listBox.KeyDown += OnListBoxKeyDown;
        listBox.PreviewKeyDown += OnListBoxPreviewKeyDown;

        Type enumType = value.GetType();
        if (!enumType.IsEnum)
            throw new InvalidOperationException();

        foreach (FieldInfo fi in enumType.GetFields(BindingFlags.Public | BindingFlags.Static))
        {
            object[] atts = fi.GetCustomAttributes(typeof(BrowsableAttribute), true);
            if (atts != null && atts.Length > 0 && !((BrowsableAttribute)atts[0]).Browsable)
                    continue;

            int index = listBox.Items.Add(fi.Name);

            if (fi.Name == value.ToString())
            {
                listBox.SetSelected(index, true);
            }
        }

        _editorService.DropDownControl(listBox);
        if ((_cancel) || (listBox.SelectedIndices.Count == 0))
            return value;

        return Enum.Parse(enumType, (string)listBox.SelectedItem);
    }

    private void OnListBoxPreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.Escape)
        {
            _cancel = true;
            _editorService.CloseDropDown();
        }
    }

    private void OnListBoxMouseClick(object sender, MouseEventArgs e)
    {
        int index = ((ListBox)sender).IndexFromPoint(e.Location);
        if (index >= 0)
        {
            _editorService.CloseDropDown();
        }
    }

    private void OnListBoxKeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            _editorService.CloseDropDown();
        }
    }
}

ЗАБЕЛЕЖКА: това не поддържа Enum, маркирани с атрибут Flags, който изисква квадратче за отметка списък вместо това. Ако някога имате нужда от това, по-сложно е, предлагам ви да разгледате тази безплатна библиотека: CodeFluentRuntimeClient, той съдържа клас EnumEditor UITypeEditor в пространството на имената CodeFluent.Runtime.Design, което поддържа това.

person Simon Mourier    schedule 16.04.2013