很多人已经回答了如何将枚举绑定到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
有没有人有任何想法如何做到这一点?
答案 0 :(得分:142)
The Enum
public enum Status { Active = 0, Canceled = 3 };
从中设置下拉值
cbStatus.DataSource = Enum.GetValues(typeof(Status));
从所选项目中获取枚举
Status status;
Enum.TryParse<Status>(cbStatus.SelectedValue.ToString(), out status);
答案 1 :(得分:24)
简化:
首先初始化此命令:(例如,在InitalizeComponent()
之后)
yourComboBox.DataSource = Enum.GetValues(typeof(YourEnum));
要在组合框上检索所选项目:
YourEnum enum = (YourEnum) yourComboBox.SelectedItem;
如果要设置组合框的值:
yourComboBox.SelectedItem = YourEnem.Foo;
答案 2 :(得分:14)
代码
comboBox1.SelectedItem = MyEnum.Something;
没问题,问题必须存在于DataBinding中。 DataBinding赋值发生在构造函数之后,主要是第一次显示组合框。尝试在Load事件中设置值。例如,添加以下代码:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
comboBox1.SelectedItem = MyEnum.Something;
}
并检查它是否有效。
答案 3 :(得分:11)
假设您有以下枚举
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;
}
}
现在返回一个对象数组,其中所有枚举都映射到字符串:
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());
创建一个函数来检索枚举类型,以防你想将它传递给函数
public Numbers GetConversionType()
{
EntityName type = (EntityName)numberComboBox.SelectedItem;
return type.GetNumber();
}
然后你应该没事:)
答案 4 :(得分:11)
尝试:
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;
}
}
答案 5 :(得分:4)
试试这个:
// fill list
MyEnumDropDownList.DataSource = Enum.GetValues(typeof(MyEnum));
// binding
MyEnumDropDownList.DataBindings.Add(new Binding("SelectedValue", StoreObject, "StoreObjectMyEnumField"));
StoreObject是我的对象示例,StoreObjectMyEnumField属性用于存储MyEnum值。
答案 6 :(得分:3)
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;
}
答案 7 :(得分:3)
根据@Amir Shenouda的回答,我最终得到了这个:
Enum的定义:
public enum Status { Active = 0, Canceled = 3 };
从中设置下拉值:
cbStatus.DataSource = Enum.GetValues(typeof(Status));
从所选项目中获取枚举:
Status? status = cbStatus.SelectedValue as Status?;
答案 8 :(得分:3)
这是解决方案 在组合框中加载枚举项:
comboBox1.Items.AddRange( Enum.GetNames(typeof(Border3DStyle)));
然后将枚举项用作文本:
toolStripStatusLabel1.BorderStyle = (Border3DStyle)Enum.Parse(typeof(Border3DStyle),comboBox1.Text);
答案 9 :(得分:2)
public enum Colors
{
Red = 10,
Blue = 20,
Green = 30,
Yellow = 40,
}
comboBox1.DataSource = Enum.GetValues(typeof(Colors));
完整来源...... Binding an enum to Combobox
答案 10 :(得分: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
}
答案 11 :(得分:1)
这些都不对我有用,但是这样做了(并且能够对每个枚举的名称进行更好的描述,这带来了额外的好处)。我不确定这是否是由于.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;
答案 12 :(得分: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
答案 13 :(得分:1)
将枚举转换为字符串列表并将其添加到comboBox
comboBox1.DataSource = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();
使用selectedItem
设置显示的值comboBox1.SelectedItem = SomeEnum.SomeValue;
答案 14 :(得分:0)
这次聚会有点晚了,
SelectedValue.ToString()方法应该拉入DisplayedName。 但是,本文DataBinding Enum and also With Descriptions显示了一种方便的方法,不仅可以使用,而且可以为枚举添加自定义描述属性,并根据需要将其用于显示的值。非常简单易行,大约15行左右的代码(除非你算上花括号)。
这是非常漂亮的代码,你可以把它作为一个扩展方法来启动......
答案 15 :(得分:0)
将枚举设置为下拉数据源的通用方法
显示名称。 选定的值将是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;
}
答案 16 :(得分:0)
仅以这种方式使用投射:
if((YouEnum)ComboBoxControl.SelectedItem == YouEnum.Español)
{
//TODO: type you code here
}
答案 17 :(得分: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;
}
}
}
}
如何使用... 声明枚举
using System.ComponentModel;
public enum CalculationType
{
[Desciption("LoaderGroup")]
LoaderGroup,
[Description("LadingValue")]
LadingValue,
[Description("PerBill")]
PerBill
}
此方法在组合框项目中显示说明
combobox1.EnumForComboBox(typeof(CalculationType));
答案 18 :(得分:0)
这在其他所有响应中可能永远都看不到,但这是我想出的代码,它的好处是可以使用DescriptionAttribute
(如果存在),但可以使用{枚举值本身。
我使用了字典,因为它具有现成的键/值项模式。 List<KeyValuePair<string,object>>
也可以工作,并且不需要不必要的哈希,但是字典可以使代码更简洁。
我得到MemberType
为Field
且为文字的成员。这将创建仅包含枚举值的成员的序列。这是可靠的,因为枚举不能包含其他字段。
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";
}
}
答案 19 :(得分:0)
这对我有用:
comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));
comboBox1.SelectedIndex = comboBox1.FindStringExact(MyEnum.something.ToString());
答案 20 :(得分:0)
在Framework 4中,您可以使用以下代码:
将MultiColumnMode枚举绑定到组合框,例如:
cbMultiColumnMode.Properties.Items.AddRange(typeof(MultiColumnMode).GetEnumNames());
并获得选定的索引:
MultiColumnMode multiColMode = (MultiColumnMode)cbMultiColumnMode.SelectedIndex;
注意:我在这个例子中使用DevExpress组合框,你可以在Win Form Combobox中做同样的事情
答案 21 :(得分:0)
这总是一个问题。 如果你有一个Sorted Enum,比如从0到......
public enum Test
one
Two
Three
End
您可以将名称绑定到组合框,而不是使用.SelectedValue
属性使用.SelectedIndex
Combobox.DataSource = System.Enum.GetNames(GetType(test))
和
Dim x as byte = 0
Combobox.Selectedindex=x
答案 22 :(得分:0)
comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));
comboBox1.SelectedIndex = (int)MyEnum.Something;
comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something);
对我来说,这两项工作都确定没有其他问题吗?
答案 23 :(得分:0)
老问题也许在这里,但我有问题,解决方案简单易行,我找到了http://www.c-sharpcorner.com/UploadFile/mahesh/1220/
它利用数据库并很好地工作,所以检查出来。
答案 24 :(得分:0)
目前我正在使用Items属性而不是DataSource,这意味着我必须为每个枚举值调用Add,但它是一个小枚举,以及它的临时代码。
然后我可以对值进行Convert.ToInt32并使用SelectedIndex进行设置。
临时解决方案,但现在是YAGNI。
为这些想法干杯,在获得一轮客户反馈后,我可能会使用它们。
答案 25 :(得分:0)
您可以使用KeyValuePair值列表作为组合框的数据源。您将需要一个辅助方法,您可以在其中指定枚举类型,并返回IEnumerable&gt;其中int是enum的值,string是枚举值的名称。在组合框中,将DisplayMember属性设置为'Key',将ValueMember属性设置为'Value'。 Value和Key是KeyValuePair结构的公共属性。然后,当您将SelectedItem属性设置为您正在执行的枚举值时,它应该可以正常工作。
答案 26 :(得分:0)
comboBox1.SelectedItem = MyEnum.Something;
应该工作得很好......你怎么知道SelectedItem
是空的?
答案 27 :(得分: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