Привязка перечисления к комбинированному окну 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 ]

2 голосов
/ 07 октября 2014
    public enum Colors
    {
        Red = 10,
        Blue = 20,
        Green = 30,
        Yellow = 40,
    }

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

Полный источник ... Связывание перечисления с Combobox

1 голос
/ 25 мая 2009

Я использую следующий вспомогательный метод, который вы можете привязать к своему списку.

    ''' <summary>
    ''' Returns enumeration as a sortable list.
    ''' </summary>
    ''' <param name="t">GetType(some enumeration)</param>
    Public Shared Function GetEnumAsList(ByVal t As Type) As SortedList(Of String, Integer)

        If Not t.IsEnum Then
            Throw New ArgumentException("Type is not an enumeration.")
        End If

        Dim items As New SortedList(Of String, Integer)
        Dim enumValues As Integer() = [Enum].GetValues(t)
        Dim enumNames As String() = [Enum].GetNames(t)

        For i As Integer = 0 To enumValues.GetUpperBound(0)
            items.Add(enumNames(i), enumValues(i))
        Next

        Return items

    End Function
1 голос
/ 13 декабря 2018

Ничего из этого не сработало для меня, но это сработало (и оно имело дополнительное преимущество, заключающееся в возможности иметь лучшее описание для названия каждого перечисления) Я не уверен, связано ли это с обновлениями .net или нет, но, тем не менее, я думаю, что это лучший способ. Вам нужно будет добавить ссылку на:

с использованием System.ComponentModel;

enum MyEnum
{
    [Description("Red Color")]
    Red = 10,
    [Description("Blue Color")]
    Blue = 50
}

....

    private void LoadCombobox()
    {
        cmbxNewBox.DataSource = Enum.GetValues(typeof(MyEnum))
            .Cast<Enum>()
            .Select(value => new
            {
                (Attribute.GetCustomAttribute(value.GetType().GetField(value.ToString()), typeof(DescriptionAttribute)) as DescriptionAttribute).Description,
                value
            })
            .OrderBy(item => item.value)
            .ToList();
        cmbxNewBox.DisplayMember = "Description";
        cmbxNewBox.ValueMember = "value";
    }

Тогда, когда вы хотите получить доступ к данным, используйте эти две строки:

        Enum.TryParse<MyEnum>(cmbxNewBox.SelectedValue.ToString(), out MyEnum proc);
        int nValue = (int)proc;
1 голос
/ 02 октября 2012

Преобразовать перечисление в список строк и добавить его в поле со списком

comboBox1.DataSource = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();

Установите отображаемое значение с помощью selectedItem

comboBox1.SelectedItem = SomeEnum.SomeValue;
0 голосов
/ 12 октября 2018

Вы можете использовать метод расширения

 public static void EnumForComboBox(this ComboBox comboBox, Type enumType)
 {
     var memInfo = enumType.GetMembers().Where(a => a.MemberType == MemberTypes.Field).ToList();
     comboBox.Items.Clear();
     foreach (var member in memInfo)
     {
         var myAttributes = member.GetCustomAttribute(typeof(DescriptionAttribute), false);
         var description = (DescriptionAttribute)myAttributes;
         if (description != null)
         {
             if (!string.IsNullOrEmpty(description.Description))
             {
                 comboBox.Items.Add(description.Description);
                 comboBox.SelectedIndex = 0;
                 comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
             }
         }   
     }
 }

Как использовать ... Объявить перечисление

using System.ComponentModel;

public enum CalculationType
{
    [Desciption("LoaderGroup")]
    LoaderGroup,
    [Description("LadingValue")]
    LadingValue,
    [Description("PerBill")]
    PerBill
}

Этот метод показывает описание в выпадающих списках

combobox1.EnumForComboBox(typeof(CalculationType));
0 голосов
/ 25 мая 2009
comboBox1.SelectedItem = MyEnum.Something;

должно работать просто отлично ... Как вы можете сказать, что SelectedItem равно нулю?

0 голосов
/ 26 июля 2018

используйте только приведение таким образом:

if((YouEnum)ComboBoxControl.SelectedItem == YouEnum.Español)
{
   //TODO: type you code here
}
0 голосов
/ 12 июня 2015

Немного опоздал на эту вечеринку,

Метод SelectedValue.ToString () должен использовать DisplayedName. Однако в этой статье DataBinding Enum, а также с описаниями показан удобный способ не только получить это, но вместо этого вы можете добавить собственный атрибут описания к перечислению и использовать его для отображаемого значения, если хотите. Очень просто и легко и около 15 строк кода (если не считать фигурные скобки) для всего.

Это довольно изящный код, и вы можете сделать его методом расширения для загрузки ...

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

Вы можете использовать список значений KeyValuePair в качестве источника данных для выпадающего списка. Вам потребуется вспомогательный метод, в котором вы можете указать тип перечисления, и он возвращает IEnumerable>, где int - это значение enum, а string - имя значения перечисления. В поле со списком установите для свойства DisplayMember значение «Key», а для свойства ValueMember значение «Value». Value и Key являются открытыми свойствами структуры KeyValuePair. Затем, когда вы устанавливаете для свойства SelectedItem значение enum, как вы это делаете, оно должно работать.

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

В настоящее время я использую свойство Items, а не DataSource, это означает, что мне нужно вызывать Add для каждого значения перечисления, но это небольшое перечисление и его временный код в любом случае.

Тогда я могу просто сделать Convert.ToInt32 для значения и установить его с помощью SelectedIndex.

Временное решение, но пока YAGNI.

Приветствую идеи, я, вероятно, буду использовать их, когда сделаю правильную версию после получения отзывов клиентов.

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