Obsazení combobox SelectedValue na Výčtový typ - WinForm

0

Otázka

Hej chlap, já wana obsazení combobox SelectedValue, aby Výčtový typ, ale vybrané hodnoty položky je seznam jako {Název, Hodnota}; Název je "popis atributu enum položky" a Hodnoty "enum položky".

var EnumItems = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(item =>
                   new
                   {
                       Text = item.GetEnumName(),
                       Value = item
                   }).ToList();
            MyCombo.DataSource = EnumItems;
            MyCombo.DisplayMember = "Text";
            MyCombo.ValueMember = "Value";

GetEnumName() Metoda:

public static string GetEnumName(this System.Enum myEnum)
        {
            var enumDisplayName = myEnum.GetType().GetMember(myEnum.ToString()).FirstOrDefault();
            if (enumDisplayName != null)
            {
                //return enumDisplayName.GetCustomAttribute<DescriptionAttribute>()?.Get();
                return string.Format("{0}", (Attribute.GetCustomAttribute(myEnum.GetType().GetField(myEnum.ToString()), typeof(DescriptionAttribute)) as DescriptionAttribute).Description, false);
            }

            return "";
        }

Snažím se tento způsob obsazení:

var getEnum = (MyEnum)Enum.Parse(typeof(MyEnum), MyCombo.SelectedValue.ToString());

ale tento způsob, jak se vrátit:

Systém.ArgumentException: 'Požadovaná hodnota{ Text = enumDescriptionText, Hodnota = enumValue }' nebyl nalezen.'

Máte nějaké řešení pro tento problém vyřešit?

c# combobox enums
2021-11-13 09:14:53
1

Nejlepší odpověď

0

Při nastavení zdroje dat, vytváření anonymní typ 'a s Text a Value vlastnosti:

comboBox1.DataSource = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(item => new
{
    Text = item.GetEnumDescription(),
    Value = item
}).ToList();

takže, to je výsledek List<'a>.

Když se snažíte načíst vybrané v ComboBox hodnoty/položky, to by bylo položka anonymní typ 'a taky, takže si můžete hodit ho MyEnum explicitně.

K řešení může být v použití dynamics, které může být také tvoje anonymní typ a při běhu má Text a Value vlastnosti:

private void OnComboBoxSelectedValueChanged(object sender, EventArgs e)
{
    dynamic selectedItem = comboBox1.SelectedItem;

    if (selectedItem != null)
    {
        MyEnum enumItem = (MyEnum)selectedItem.Value;
        string itemDescription = selectedItem.Text;

        _ = MessageBox.Show(string.Format("Enum item: {0}\nItem description: {1}", enumItem, itemDescription));
    }
}

Mám tento výsledek:

enter image description here

Můj enum vypadá:

enum MyEnum
{
    [Description("My 1st item")]
    MyItem1,
    [Description("My 2nd item")]
    MyItem2,
    [Description("My 3rd item")]
    MyItem3
}

Moje .GetEnumDescription() je vaše rewrited .GetEnumName() v ternární styl:

public static class EnumExtensions
{
    public static string GetEnumDescription(this Enum enumValue) =>
        enumValue.GetType().GetMember(nameof(enumValue)).FirstOrDefault() is MemberInfo
        ? $"{(Attribute.GetCustomAttribute(enumValue.GetType().GetField(nameof(enumValue)), typeof(DescriptionAttribute)) as DescriptionAttribute)?.Description}"
        : string.Empty;
}
2021-11-13 10:11:02

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................