将枚举绑定到WinFormscombobox,然后进行设置

很多人已经回答了如何将枚举绑定到WinForms中的combobox的问题。 就像这样:

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 

有没有人有任何想法如何做到这一点?

Enum

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

从它设置下拉值

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

从选定的项目获取枚举

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

代码

 comboBox1.SelectedItem = MyEnum.Something; 

是好的,问题必须驻留在DataBinding中。 DataBinding赋值在构造函数之后发生,主要是第一次显示combobox。 尝试设置Load事件中的值。 例如,添加以下代码:

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

并检查它是否工作。

假设你有以下的枚举

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

你需要一个结构来将这些值映射到一个string:

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

现在返回一个所有枚举映射到一个string的对象数组:

 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:

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

创build一个函数来检索枚举types,以防将其传递给函数

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

然后你应该没问题:)

为了简化:

首先初始化这个命令:(例如在InitalizeComponent()

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

检索combobox上的选定项目
YourEnum enum = (YourEnum) yourComboBox.SelectedItem

如果你想为combobox设置值
yourComboBox.SelectedItem = YourEnem.Foo

尝试:

 comboBox1.SelectedItem = MyEnum.Something; 

EDITS:

哎呀,你已经试过了。 但是,当我的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; } } 

尝试这个:

 // fill list MyEnumDropDownList.DataSource = Enum.GetValues(typeof(MyEnum)); // binding MyEnumDropDownList.DataBindings.Add(new Binding("SelectedValue", StoreObject, "StoreObjectMyEnumField")); 

StoreObject是StoreObjectMyEnumField属性用于存储MyEnum值的对象示例。

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

这是加载combobox中枚举项的解决scheme:

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

然后使用枚举项作为文本:

 toolStripStatusLabel1.BorderStyle = (Border3DStyle)Enum.Parse(typeof(Border3DStyle),comboBox1.Text); 
  public enum Colors { Red = 10, Blue = 20, Green = 30, Yellow = 40, } comboBox1.DataSource = Enum.GetValues(typeof(Colors)); 

完整源代码… 将枚举绑定到Combobox

根据@Amir Shenouda的回答,我最终得出这个结论:

枚举的定义:

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

从它设置下拉值:

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

从选定的项目获取枚举:

 Status? status = cbStatus.SelectedValue as Status?; 

我使用下面的助手方法,你可以绑定到你的列表。

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

将枚举转换为一个string列表,并将其添加到combobox

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

使用selectedItem设置显示的值

 comboBox1.SelectedItem = SomeEnum.SomeValue; 
 comboBox1.SelectedItem = MyEnum.Something; 

应该工作得很好…你怎么知道SelectedItem是空的?

你可以使用“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 

您可以使用KeyValuePair值的列表作为combobox的数据源。 您需要一个帮助器方法,您可以在其中指定枚举types,并返回IEnumerable>,其中int是枚举值,string是枚举值的名称。 在combobox中,将DisplayMember属性设置为“Key”,将ValueMember属性设置为“Value”。 Value和Key是KeyValuePair结构的公共属性。 然后,当你设置SelectedItem属性为一个枚举值就像你正在做的,它应该工作。

目前我正在使用Items属性而不是DataSource,这意味着我必须为每个枚举值调用Add,但是它的一个小枚举和它的临时代码无论如何。

然后,我可以对值进行Convert.ToInt32,并使用SelectedIndex进行设置。

暂时的解决办法,但YAGNI现在。

欢呼的想法,我可能会使用他们,当我做了适当的版本后,得到一轮客户的反馈。

老问题也许在这里,但我有问题,解决scheme很简单,我发现这个http://www.c-sharpcorner.com/UploadFile/mahesh/1220/

它使用数据库,并很好地工作,所以检查出来。

 comboBox1.DataSource = Enum.GetValues(typeof(MyEnum)); comboBox1.SelectedIndex = (int)MyEnum.Something; comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something); 

这两个工作是你确定没有其他错误?

将枚举设置为下拉数据源的通用方法

显示将是名称。 选定的值将是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; } 

那总是一个问题。 如果你有一个Sorted 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 

在框架4中,您可以使用以下代码:

要将MultiColumnMode enum绑定到combobox,例如:

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

并获得选定的索引:

 MultiColumnMode multiColMode = (MultiColumnMode)cbMultiColumnMode.SelectedIndex; 

注意:在这个例子中我使用了DevExpresscombobox,你可以在Win Form Combobox中做同样的事情

晚会有点迟,

SelectedValue.ToString()方法应该拉入DisplayedName。 但是,这篇文章的DataBinding枚举和也与描述显示了一个方便的方法不仅有,而是你可以添加一个自定义的描述属性的枚举,并将其用于显示值,如果你喜欢。 非常简单和容易,大约15行左右的代码(除非你计算大括号)的一切。

这是非常漂亮的代码,你可以使它成为一个扩展方法来启动…