-1

私のプロジェクトには、次のような列挙型があります。

public enum UserFrienlyEnum
{
    [Description("it need spec training")]
    SPECIAL_TRAINING = 1,
    [Description("it need normal training")]
    NORMAL_TRAINING = 2,
    [Description("it need simple training")]
    SIMPLE_TRAINING = 3
}

このメソッドを使用して、この列挙型をコンボボックスにバインドしました。

public static void setEnumValues(ComboBox cxbx, Type typ)
{
    if (!typ.IsEnum)
    {
        throw new ArgumentException("Only Enum types can be set");
    }

    List<KeyValuePair<string, int>> list = new List<KeyValuePair<string, int>>();

    foreach (int i in Enum.GetValues(typ))
    {
        string name = Enum.GetName(typ, i);
        string desc = name;
        FieldInfo fi = typ.GetField(name);

        // Get description for enum element
        DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attributes.Length > 0)
        {
            string s = attributes[0].Description;

            if (!string.IsNullOrEmpty(s))
            {
                desc = s;
            }
        }

        list.Add(new KeyValuePair<string, int>(desc, i));
    }
    // NOTE: It is very important that DisplayMember and ValueMember are set before DataSource.
    //       If you do, this works fine, and the SelectedValue of the ComboBox will be an int
    //       version of the Enum.
    //       If you don't, it will be a KeyValuePair.
    cxbx.DisplayMember = "Key";
    cxbx.ValueMember = "Value";
    cxbx.DataSource = list;
}

上記のメソッドを使用して、コンボボックスを myEnum に次のようにバインドします。

setEnumValues(comboBox, typeof(myEnum));

ここで問題は、コンボボックスの項目または値を特定のものに設定する方法です。次のようになります。

combobox.SelectedValue = myEnum.value;

私のプロジェクトは、Visual Studio 2010 環境の C# Windows プロジェクトです。

4

2 に答える 2

1

私はあなたのコードを複製しました。これはあなたが持っているものだと思います。これは私にとっては完全にうまく機能しています。

namespace WindowsFormsApplication1
{
    public class MyClass
    {
        public string Something { get; set; }
        public UserFrienlyEnum foo { get; set; }
    }
    public enum UserFrienlyEnum
    {
        [Description("it need spec training")]
        SPECIAL_TRAINING = 1,
        [Description("it need normal training")]
        NORMAL_TRAINING = 2,
        [Description("it need simple training")]
        SIMPLE_TRAINING = 3
    }
    public partial class Form1 : Form
    {


        private void Form1_Load(object sender, EventArgs e)
        {
            setEnumValues(this.comboBox1, typeof(UserFrienlyEnum));
            MyClass variable = new MyClass();
            variable.foo = UserFrienlyEnum.NORMAL_TRAINING;
            this.comboBox1.SelectedValue = (int)variable.foo;

        }

        public static void setEnumValues(ComboBox cxbx, Type typ)
        {
            if (!typ.IsEnum)
            {
                throw new ArgumentException("Only Enum types can be set");
            }

            List<KeyValuePair<string, int>> list = new List<KeyValuePair<string, int>>();

            foreach (int i in Enum.GetValues(typ))
            {
                string name = Enum.GetName(typ, i);
                string desc = name;
                FieldInfo fi = typ.GetField(name);

                // Get description for enum element
                DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
                if (attributes.Length > 0)
                {
                    string s = attributes[0].Description;
                    if (!string.IsNullOrEmpty(s))
                    {
                        desc = s;
                    }
                }

                list.Add(new KeyValuePair<string, int>(desc, i));
            }
            // NOTE: It is very important that DisplayMember and ValueMember are set before DataSource.
            //       If you do, this works fine, and the SelectedValue of the ComboBox will be an int
            //       version of the Enum.
            //       If you don't, it will be a KeyValuePair.
            cxbx.DisplayMember = "Key";
            cxbx.ValueMember = "Value";
            cxbx.DataSource = list;
        }

        public Form1()
        {
            InitializeComponent();
        }


    }
}

結果:

ここに画像の説明を入力

于 2012-08-23T17:33:54.657 に答える
0

友人のHanletのおかげで、これが最も簡単な答えです。

combobox.SelectedValue = (int) myEnum.value;

それをintにキャストすることが鍵でした。

于 2012-08-23T19:05:54.027 に答える