Привязка перечисления к комбинированному окну WinForms, а затем установка его - PullRequest
109 голосов
/ 25 мая 2009

многие люди ответили на вопрос, как связать перечисление со списком в WinForms. Это так:

comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));

Но это довольно бесполезно без возможности установить фактическое значение для отображения.

Я пробовал:

comboBox1.SelectedItem = MyEnum.Something; // Does not work. SelectedItem remains null

Я также пробовал:

comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something); // ArgumentOutOfRangeException, SelectedIndex remains -1

У кого-нибудь есть идеи, как это сделать?

Ответы [ 26 ]

145 голосов
/ 03 марта 2012

Перечисление

public enum Status { Active = 0, Canceled = 3 }; 

Настройка выпадающих значений из него

cbStatus.DataSource = Enum.GetValues(typeof(Status));

Получение перечисления из выбранного элемента

Status status; 
Enum.TryParse<Status>(cbStatus.SelectedValue.ToString(), out status); 
24 голосов
/ 04 сентября 2015

Для упрощения:

Сначала инициализируйте эту команду: (например, после InitalizeComponent())

yourComboBox.DataSource =  Enum.GetValues(typeof(YourEnum));

Чтобы получить выбранный элемент в выпадающем списке:

YourEnum enum = (YourEnum) yourComboBox.SelectedItem;

Если вы хотите установить значение для выпадающего списка:

yourComboBox.SelectedItem = YourEnem.Foo;
14 голосов
/ 25 мая 2009

код

comboBox1.SelectedItem = MyEnum.Something;

в порядке, проблема должна находиться в привязке данных. Присвоение DataBinding происходит после конструктора, в основном при первом показе комбинированного списка. Попробуйте установить значение в событии Load. Например, добавьте этот код:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    comboBox1.SelectedItem = MyEnum.Something;
}

И проверьте, работает ли он.

11 голосов
/ 15 декабря 2010

Допустим, у вас есть следующее перечисление

public enum Numbers {Zero = 0, One, Two};

Вам необходимо иметь структуру, чтобы отобразить эти значения в строку:

public struct EntityName
{
    public Numbers _num;
    public string _caption;

    public EntityName(Numbers type, string caption)
    {
        _num = type;
        _caption = caption;
    }

    public Numbers GetNumber() 
    {
        return _num;
    }

    public override string ToString()
    {
        return _caption;
    }
}

Теперь верните массив объектов со всеми перечислениями, сопоставленными со строкой:

public object[] GetNumberNameRange()
{
    return new object[]
    {
        new EntityName(Number.Zero, "Zero is chosen"),
        new EntityName(Number.One, "One is chosen"),
        new EntityName(Number.Two, "Two is chosen")
    };
}

Для заполнения поля со списком используйте следующее:

ComboBox numberCB = new ComboBox();
numberCB.Items.AddRange(GetNumberNameRange());

Создайте функцию для получения типа enum на тот случай, если вы захотите передать его функции

public Numbers GetConversionType() 
{
    EntityName type = (EntityName)numberComboBox.SelectedItem;
    return type.GetNumber();           
}

и тогда с тобой все будет в порядке:)

11 голосов
/ 25 мая 2009

Попробуйте:

comboBox1.SelectedItem = MyEnum.Something;

редактирует:

Упс, вы уже пробовали это. Однако, это сработало для меня, когда мой comboBox был установлен как DropDownList.

Вот мой полный код, который работает для меня (как с DropDown, так и с DropDownList):

public partial class Form1 : Form
{
    public enum BlahEnum
    { 
        Red,
        Green,
        Blue,
        Purple
    }

    public Form1()
    {
        InitializeComponent();

        comboBox1.DataSource = Enum.GetValues(typeof(BlahEnum));

    }

    private void button1_Click(object sender, EventArgs e)
    {
        comboBox1.SelectedItem = BlahEnum.Blue;
    }
}
4 голосов
/ 16 августа 2014

Попробуйте это:

// fill list
MyEnumDropDownList.DataSource = Enum.GetValues(typeof(MyEnum));

// binding
MyEnumDropDownList.DataBindings.Add(new Binding("SelectedValue", StoreObject, "StoreObjectMyEnumField"));

StoreObject - мой пример объекта со свойством StoreObjectMyEnumField для значения магазина MyEnum.

3 голосов
/ 24 февраля 2012

это решение загрузить элемент списка в выпадающий список:

comboBox1.Items.AddRange( Enum.GetNames(typeof(Border3DStyle)));

А затем используйте элемент enum как текст:

toolStripStatusLabel1.BorderStyle = (Border3DStyle)Enum.Parse(typeof(Border3DStyle),comboBox1.Text);
3 голосов
/ 23 сентября 2014
 public static void FillByEnumOrderByNumber<TEnum>(this System.Windows.Forms.ListControl ctrl, TEnum enum1, bool showValueInDisplay = true) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum enumValue in Enum.GetValues(typeof(TEnum))
                     select
                        new
                         KeyValuePair<TEnum, string>(   (enumValue), enumValue.ToString());

        ctrl.DataSource = values
            .OrderBy(x => x.Key)

            .ToList();

        ctrl.DisplayMember = "Value";
        ctrl.ValueMember = "Key";

        ctrl.SelectedValue = enum1;
    }
    public static void  FillByEnumOrderByName<TEnum>(this System.Windows.Forms.ListControl ctrl, TEnum enum1, bool showValueInDisplay = true  ) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum enumValue in Enum.GetValues(typeof(TEnum))
                     select 
                        new 
                         KeyValuePair<TEnum,string> ( (enumValue),  enumValue.ToString()  );

        ctrl.DataSource = values
            .OrderBy(x=>x.Value)
            .ToList();

        ctrl.DisplayMember = "Value";
        ctrl.ValueMember = "Key";

        ctrl.SelectedValue = enum1;
    }
3 голосов
/ 05 апреля 2016

Исходя из ответа @Amir Shenouda, я получаю следующее:

Определение Enum:

public enum Status { Active = 0, Canceled = 3 }; 

Настройка выпадающих значений из него:

cbStatus.DataSource = Enum.GetValues(typeof(Status));

Получение перечисления из выбранного элемента:

Status? status = cbStatus.SelectedValue as Status?;
2 голосов
/ 16 августа 2011
public Form1()
{
    InitializeComponent();
    comboBox.DataSource = EnumWithName<SearchType>.ParseEnum();
    comboBox.DisplayMember = "Name";
}

public class EnumWithName<T>
{
    public string Name { get; set; }
    public T Value { get; set; }

    public static EnumWithName<T>[] ParseEnum()
    {
        List<EnumWithName<T>> list = new List<EnumWithName<T>>();

        foreach (object o in Enum.GetValues(typeof(T)))
        {
            list.Add(new EnumWithName<T>
            {
                Name = Enum.GetName(typeof(T), o).Replace('_', ' '),
                Value = (T)o
            });
        }

        return list.ToArray();
    }
}

public enum SearchType
{
    Value_1,
    Value_2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...