将枚举绑定到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行左右的代码(除非你计算大括号)的一切。
这是非常漂亮的代码,你可以使它成为一个扩展方法来启动…