ผูก enum กับกล่องคำสั่งผสม WinForms แล้วตั้งค่า


122

หลายคนตอบคำถามเกี่ยวกับวิธีผูก enum กับ combo box ใน 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

ใครมีความคิดว่าจะทำอย่างไร?


2
ทำไมไม่ลอง ComboBox.SelectedValue แทนล่ะ?
Oliver Friedrich

5
หากคำถามของคุณได้รับคำตอบแล้วคุณควรเลือกคำตอบจริงๆ
Ryan The Leach

จุดของการเชื่อมโยง enum นั้นไม่ชัดเจนนัก enum มีแนวโน้มที่จะไม่เปลี่ยนแปลงระหว่างรันไทม์ คุณยังสามารถเขียนวิธีการขยายที่จะเติมคอลเลกชันรายการของคอมโบบ็อกซ์ด้วยค่าทั้งหมดของ enum
Andreas

ที่เกี่ยวข้อง: stackoverflow.com/q/5638639/161052
JYelton

@OliverFriedrich SelectedValueเป็นสาเหตุInvalidOperationExceptionให้ฉัน "ไม่สามารถตั้งค่าSelectedValueใน a ที่ListControlมีค่าว่างValueMember"
Tyler

คำตอบ:


161

Enum

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

การตั้งค่าดรอปดาวน์จากมัน

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

รับ enum จากรายการที่เลือก

Status status; 
Enum.TryParse<Status>(cbStatus.SelectedValue.ToString(), out status); 

5
ขอบคุณสิ่งนี้ใช้ได้กับฉัน โปรดจำไว้ว่า tryparse คือคำสั่ง. net 4.0
real_yggdrasil

สำหรับฉัน SelectedValue เป็นโมฆะเสมอ ดูเหมือนว่า combobox จะไม่ได้รับการเชื่อมต่อ (MyEnum) this.GridView.CurrentRow.Cells [ "comboColumnCell"]. ราคา ฉันสามารถเห็นค่าได้ แต่ภายในมันแสดงข้อยกเว้นของตัวชี้ที่เป็นโมฆะ
ssal

3
นี่เป็นวิธีที่ OP ไม่ต้องการใช้ ปัญหาคือผู้ใช้แสดงชื่อในรหัสของแต่ละค่าซึ่งอาจมีการปรับโครงสร้างใหม่และไม่เป็นมิตรกับผู้ใช้มากที่สุด
Alejandro

5
เหตุใดจึงต้องใช้ TryParse แทนที่จะแยกวิเคราะห์ ... var status (สถานะ) Enum.Parse (typeof (Status), cbStatus.SelectedValue ToString ()); ... คุณผูก enum กับคอมโบบ็อกซ์เพื่อให้คุณรู้ว่าค่านั้นต้องเป็นค่า enum ที่ถูกต้องและถ้า มันไม่ใช่สิ่งที่ผิดพลาดไปมากและคุณอาจต้องการข้อยกเว้น
bytedev

1
เหตุใดสิ่งนี้จึงถูกเพิ่มขึ้นเพื่อการให้อภัย คำถามคือวิธีตั้งค่าคอมโบบ็อกซ์ที่เลือกโดยทางโปรแกรมโดยใช้หนึ่งในค่าของ enum
Tyler

39

เพื่อให้ง่ายขึ้น:

เริ่มต้นคำสั่งนี้ก่อน: (เช่นหลังInitalizeComponent())

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

ในการดึงรายการที่เลือกบนคอมโบบ็อกซ์:

YourEnum enum = (YourEnum) yourComboBox.SelectedItem;

หากคุณต้องการตั้งค่าสำหรับคอมโบบ็อกซ์:

yourComboBox.SelectedItem = YourEnem.Foo;

2
สิ่งนี้ใช้ได้ตราบเท่าที่ค่าที่แสดงเป็นค่าเดียวกับสมาชิกค่ามิฉะนั้นจะไม่เป็นเช่นนั้น
Lord of Scripts

15

รหัส

comboBox1.SelectedItem = MyEnum.Something;

ก็โอเคปัญหาต้องอยู่ใน DataBinding การกำหนด DataBinding เกิดขึ้นหลังจากตัวสร้างส่วนใหญ่จะแสดงในครั้งแรกที่คอมโบบ็อกซ์แสดง ลองตั้งค่าในเหตุการณ์ Load ตัวอย่างเช่นเพิ่มรหัสนี้:

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

และตรวจสอบว่าใช้งานได้หรือไม่


12

ลอง:

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;
    }
}

น่าสนใจเป็นอย่างยิ่งที่คุณสามารถทำ `comboBox1.SelectedItem = BlahEnum.Blue;` แต่ถ้าคุณต้องการให้สิ่งต่างๆในคอมโบบ็อกซ์เป็นสตริงเช่นไอเท็มของคอมโบบ็อกซ์ให้เป็น "วิตามินเม็ดเคี้ยว"?
barlop

11

สมมติว่าคุณมี enum ต่อไปนี้

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;
    }
}

ตอนนี้ส่งคืนอาร์เรย์ของวัตถุที่มี enums ทั้งหมดที่แมปกับสตริง

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();           
}

แล้วคุณก็จะโอเค :)


+1 ทางออกที่ดี เพิ่งมีปัญหานี้มากและได้รับการแก้ไขในลักษณะเดียวกัน (เพียงแค่ใช้Tupleแทน) ฉันจะเปลี่ยนทั้งค่า enum และคำอธิบายเป็นคุณสมบัติจากนั้นเพิ่ม a numberCB.DisplayProperty = "Caption"; `และnumberCB.ValueProperty = "Num"เพื่อให้คุณสามารถใช้SelectedValueโดยตรงและเชื่อมโยงกับมัน
Alejandro

IMHO อาจเป็นซอร์สโค้ดตัวอย่างที่สมบูรณ์ยิ่งขึ้นหากมีฟังก์ชันเช่นเพิ่ม“ ทั้งหมด” / ตัวเลือก“ เลือกทั้งหมด” ไปยัง ComboBox ที่ใช้เพื่อกรองแถวทั้งหมดในการค้นหา
Kiquenet

5

ลองสิ่งนี้:

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

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

StoreObject เป็นตัวอย่างวัตถุของฉันที่มีคุณสมบัติ StoreObjectMyEnumField สำหรับเก็บค่า MyEnum


1
นี่เป็นแนวทางที่ดีที่สุด แต่มันก็ไม่ได้ผลสำหรับฉัน ฉันต้องใช้ "SelectedItem" แทน "SelectedValue"
Tiago Freitas Leal

4
 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;
    }

คุณหมายถึงอะไร? ฉันไม่เข้าใจความคิดเห็นของคุณ วิธีการขยายนี้ใช้ได้ผล
Mickey Perlstein

ขึ้นอยู่กับว่าหมายเลข enum ของคุณอนุญาตหรือธง ถ้าเป็นเช่นนั้นคุณสามารถเพิ่มแฟล็กที่ 255 เรียกว่า All และเรียกใช้ฟังก์ชันด้วย All เป็น enum1 ซึ่งจะสร้างค่าเริ่มต้น เช่น comboBox1.FillByEnumOrderByName (MyEnum All)
Mickey Perlstein

ตัวเลือกใด ๆ เช่นนี้: var l = values.OrderBy (x => x.Value) .oList (); l. แทรก (0, "ทั้งหมด");
Kiquenet

enum ของฉันคือ enum A {เป็ด = 0, หงส์ = 1, โจ๊กเกอร์ = 3}; ระบบของคุณจะไม่ทำงานสำหรับสถานการณ์ของฉัน
Mickey Perlstein

3

นี่คือวิธีการแก้ปัญหาในการโหลดรายการ enum ใน combobox:

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

จากนั้นใช้รายการ enum เป็นข้อความ:

toolStripStatusLabel1.BorderStyle = (Border3DStyle)Enum.Parse(typeof(Border3DStyle),comboBox1.Text);

3

จากคำตอบของ @Amir Shenouda ฉันจบลงด้วยสิ่งนี้:

คำจำกัดความของ Enum:

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

การตั้งค่าดรอปดาวน์จากมัน:

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

รับ enum จากรายการที่เลือก:

Status? status = cbStatus.SelectedValue as Status?;

2
ทำไมต้องใช้ nullable? คุณสามารถใช้การแคสต์แบบชัดแจ้ง (การหล่อในวงเล็บ) และไม่ใช้ค่าว่างได้
John Demetriou

2
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
}

IMHO อาจเป็นซอร์สโค้ดตัวอย่างที่สมบูรณ์ยิ่งขึ้นหากมีฟังก์ชันเช่นเพิ่ม“ ทั้งหมด” / ตัวเลือก“ เลือกทั้งหมด” ไปยัง ComboBox ที่ใช้เพื่อกรองแถวทั้งหมดในการค้นหา
Kiquenet


1

ฉันใช้วิธีการช่วยเหลือต่อไปนี้ซึ่งคุณสามารถผูกเข้ากับรายการของคุณได้

    ''' <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

แปลง enum เป็นรายการสตริงและเพิ่มลงใน comboBox

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

ตั้งค่าที่แสดงโดยใช้ selectedItem

comboBox1.SelectedItem = SomeEnum.SomeValue;

1

สิ่งเหล่านี้ไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ทำได้ (และมีประโยชน์เพิ่มเติมในการสามารถอธิบายชื่อของแต่ละ enum ได้ดีขึ้น) ฉันไม่แน่ใจว่าเป็นเพราะการอัปเดต. 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

สิ่งนี้อาจจะไม่ปรากฏในการตอบกลับอื่น ๆ ทั้งหมด แต่นี่คือรหัสที่ฉันคิดขึ้นมาซึ่งมีประโยชน์ในการใช้DescriptionAttributeif ที่มีอยู่ แต่จะใช้ชื่อของค่า enum เอง

ฉันใช้พจนานุกรมเพราะมีรูปแบบรายการคีย์ / ค่าสำเร็จรูป List<KeyValuePair<string,object>>ยังจะทำงานและไม่มีคร่ำเครียดที่ไม่จำเป็น แต่ทำให้พจนานุกรมรหัสทำความสะอาด

ฉันได้รับสมาชิกที่มีMemberTypeของFieldและที่มีตัวอักษร สิ่งนี้สร้างลำดับของสมาชิกเท่านั้นที่เป็นค่า enum สิ่งนี้มีประสิทธิภาพเนื่องจาก enum ไม่สามารถมีฟิลด์อื่นได้

public static class ControlExtensions
{
    public static void BindToEnum<TEnum>(this ComboBox comboBox)
    {
        var enumType = typeof(TEnum);

        var fields = enumType.GetMembers()
                              .OfType<FieldInfo>()
                              .Where(p => p.MemberType == MemberTypes.Field)
                              .Where(p => p.IsLiteral)
                              .ToList();

        var valuesByName = new Dictionary<string, object>();

        foreach (var field in fields)
        {
            var descriptionAttribute = field.GetCustomAttribute(typeof(DescriptionAttribute), false) as DescriptionAttribute;

            var value = (int)field.GetValue(null);
            var description = string.Empty;

            if (!string.IsNullOrEmpty(descriptionAttribute?.Description))
            {
                description = descriptionAttribute.Description;
            }
            else
            {
                description = field.Name;
            }

            valuesByName[description] = value;
        }

        comboBox.DataSource = valuesByName.ToList();
        comboBox.DisplayMember = "Key";
        comboBox.ValueMember = "Value";
    }


}

0
comboBox1.SelectedItem = MyEnum.Something;

ควรใช้งานได้ดี ... คุณจะบอกได้อย่างไรว่าSelectedItemเป็นโมฆะ?


ฉันสามารถตรวจสอบได้ในดีบักเกอร์ ฉันคิดว่าเป็นเพราะประเภทของ SelectedItem เป็นวัตถุเช่นประเภทอ้างอิงและ enums เป็นประเภทค่า แม้ว่าฉันจะคาดหวังว่าคอมไพเลอร์จะจับได้

0

คุณสามารถใช้ฟังก์ชัน "FindString .. ":

Public Class Form1
    Public Enum Test
        pete
        jack
        fran
        bill
    End Enum
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ComboBox1.DataSource = [Enum].GetValues(GetType(Test))
        ComboBox1.SelectedIndex = ComboBox1.FindStringExact("jack")
        ComboBox1.SelectedIndex = ComboBox1.FindStringExact(Test.jack.ToString())
        ComboBox1.SelectedIndex = ComboBox1.FindStringExact([Enum].GetName(GetType(Test), Test.jack))
        ComboBox1.SelectedItem = Test.bill
    End Sub
End Class

0

คุณสามารถใช้รายการของค่า KeyValuePair เป็นแหล่งข้อมูลสำหรับคอมโบบ็อกซ์ คุณจะต้องมีตัวช่วยที่คุณสามารถระบุชนิด enum และส่งคืน IEnumerable> โดยที่ int คือค่า enum และสตริงคือชื่อของค่า enum ใน combobox ของคุณตั้งค่าคุณสมบัติ DisplayMember เป็น 'Key' และ ValueMember เป็น 'Value' ค่าและคีย์เป็นคุณสมบัติสาธารณะของโครงสร้าง KeyValuePair จากนั้นเมื่อคุณตั้งค่าคุณสมบัติ SelectedItem เป็นค่า enum เหมือนที่คุณกำลังทำอยู่มันควรจะใช้งานได้


0

ในขณะที่ฉันใช้คุณสมบัติ Items แทน DataSource หมายความว่าฉันต้องเรียก Add สำหรับแต่ละค่า enum แต่เป็น enum ขนาดเล็กและรหัสชั่วคราว

จากนั้นฉันก็สามารถแปลง ToInt32 กับค่าและตั้งค่าด้วย SelectedIndex

วิธีแก้ปัญหาชั่วคราว แต่ YAGNI สำหรับตอนนี้

ขอขอบคุณสำหรับแนวคิดนี้ฉันอาจจะใช้เมื่อฉันทำเวอร์ชันที่เหมาะสมหลังจากได้รับคำติชมจากลูกค้ารอบหนึ่ง



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

comboBox1.SelectedIndex = (int)MyEnum.Something;

comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something);

ทั้งสองงานนี้สำหรับฉันคุณแน่ใจหรือไม่ว่าไม่มีอะไรผิดปกติ?


2
ไม่แน่ใจว่าจะได้ผลหากใช้ค่า enum ที่กำหนดเองเช่นenum MyEnum { Something = 47 }
Samantha Branham

0

วิธีการทั่วไปในการตั้งค่า enum เป็นแหล่งข้อมูลสำหรับรายการแบบเลื่อนลง

ดิสเพลย์จะเป็นชื่อ ค่าที่เลือกจะเป็น Enum เอง

public IList<KeyValuePair<string, T>> GetDataSourceFromEnum<T>() where T : struct,IConvertible
    {
        IList<KeyValuePair<string, T>> list = new BindingList<KeyValuePair<string, T>>();
        foreach (string value in Enum.GetNames(typeof(T)))
        {
            list.Add(new KeyValuePair<string, T>(value, (T)Enum.Parse(typeof(T), value)));
        }
        return list;
    }

0

นั่นเป็นปัญหาเสมอ ถ้าคุณมี Enum ที่เรียงลำดับเช่นตั้งแต่ 0 ถึง ...

public enum Test
      one
      Two
      Three
 End

คุณสามารถผูกชื่อกับ combobox และแทนที่จะใช้การใช้.SelectedValueคุณสมบัติ.SelectedIndex

   Combobox.DataSource = System.Enum.GetNames(GetType(test))

และ

Dim x as byte = 0
Combobox.Selectedindex=x

0

ใน Framework 4 คุณสามารถใช้รหัสต่อไปนี้:

ในการผูก MultiColumnMode enum กับ combobox ตัวอย่างเช่น:

cbMultiColumnMode.Properties.Items.AddRange(typeof(MultiColumnMode).GetEnumNames());

และเพื่อรับดัชนีที่เลือก:

MultiColumnMode multiColMode = (MultiColumnMode)cbMultiColumnMode.SelectedIndex;

หมายเหตุ: ฉันใช้ DevExpress combobox ในตัวอย่างนี้คุณสามารถทำได้เช่นเดียวกันใน Win Form Combobox


0

สายไปหน่อยสำหรับงานปาร์ตี้นี้

SelectedValue ToString () เมธอดควรดึง DisplayedName อย่างไรก็ตามบทความนี้DataBinding Enum และ With Descriptionแสดงวิธีที่สะดวกในการไม่เพียง แต่มี แต่คุณสามารถเพิ่มแอตทริบิวต์คำอธิบายแบบกำหนดเองให้กับ enum และใช้เป็นค่าที่แสดงได้หากคุณต้องการ ง่ายและสะดวกมากและมีโค้ดประมาณ 15 บรรทัด (เว้นแต่คุณจะนับวงเล็บปีกกา) สำหรับทุกอย่าง

เป็นรหัสที่ค่อนข้างดีและคุณสามารถทำให้เป็นวิธีการขยายเพื่อบูต ...



0

คุณสามารถใช้วิธีการขยาย

 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;
             }
         }   
     }
 }

วิธีใช้ ... ประกาศ enum

using System.ComponentModel;

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

วิธีนี้แสดงคำอธิบายในรายการกล่องคำสั่งผสม

combobox1.EnumForComboBox(typeof(CalculationType));

0

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));
comboBox1.SelectedIndex = comboBox1.FindStringExact(MyEnum.something.ToString());
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.