多くの人が列挙型を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
誰にもこれを行う方法はありますか?
列挙
public enum Status { Active = 0, Canceled = 3 };
それからドロップダウン値を設定する
cbStatus.DataSource = Enum.GetValues(typeof(Status));
選択したアイテムから列挙型を取得する
Status status;
Enum.TryParse<Status>(cbStatus.SelectedValue.ToString(), out status);
単純化するには:
最初にこのコマンドを初期化します:(例:InitalizeComponent()
の後)
yourComboBox.DataSource = Enum.GetValues(typeof(YourEnum));
コンボボックスで選択したアイテムを取得するには:
YourEnum enum = (YourEnum) yourComboBox.SelectedItem;
コンボボックスの値を設定する場合:
yourComboBox.SelectedItem = YourEnem.Foo;
コード
comboBox1.SelectedItem = MyEnum.Something;
大丈夫、問題はDataBindingに存在する必要があります。 DataBindingの割り当ては、主にコンボボックスが表示されるときに、コンストラクターの後に発生します。 Loadイベントで値を設定してください。たとえば、次のコードを追加します。
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
comboBox1.SelectedItem = MyEnum.Something;
}
そして、それが機能するかどうかを確認します。
試してください:
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;
}
}
次の列挙型があるとしましょう
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();
}
そして、あなたは大丈夫でなければなりません:)
これを試して:
// fill list
MyEnumDropDownList.DataSource = Enum.GetValues(typeof(MyEnum));
// binding
MyEnumDropDownList.DataBindings.Add(new Binding("SelectedValue", StoreObject, "StoreObjectMyEnumField"));
StoreObjectは、MyEnum値を格納するためのStoreObjectMyEnumFieldプロパティを持つ私のオブジェクトの例です。
これは、comboboxに列挙型のアイテムをロードするソリューションです。
comboBox1.Items.AddRange( Enum.GetNames(typeof(Border3DStyle)));
そして、enumアイテムをテキストとして使用します:
toolStripStatusLabel1.BorderStyle = (Border3DStyle)Enum.Parse(typeof(Border3DStyle),comboBox1.Text);
@Amir Shenoudaからの回答に基づいて、私はこれで終わります:
列挙型の定義:
public enum Status { Active = 0, Canceled = 3 };
それからドロップダウン値を設定する:
cbStatus.DataSource = Enum.GetValues(typeof(Status));
選択したアイテムから列挙型を取得する:
Status? status = cbStatus.SelectedValue as Status?;
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 enum Colors
{
Red = 10,
Blue = 20,
Green = 30,
Yellow = 40,
}
comboBox1.DataSource = Enum.GetValues(typeof(Colors));
完全なソース... 列挙型をコンボボックスにバインド
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
}
これらのどれも私にとってはうまくいきませんでしたが、これはうまくいきました(各列挙の名前のより良い説明を持つことができるという追加の利点がありました)。 .netの更新によるものかどうかはわかりませんが、それが最善の方法だと思います。次への参照を追加する必要があります。
using 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";
}
次に、データにアクセスする場合は、次の2行を使用します。
Enum.TryParse<MyEnum>(cmbxNewBox.SelectedValue.ToString(), out MyEnum proc);
int nValue = (int)proc;
列挙型を文字列のリストに変換し、これをcomboBoxに追加します
comboBox1.DataSource = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();
SelectedItemを使用して表示値を設定します
comboBox1.SelectedItem = SomeEnum.SomeValue;
リストにバインドできる次のヘルパーメソッドを使用します。
''' <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
ドロップダウンのデータソースとして列挙型を設定するための一般的な方法
表示は名前になります。選択された値は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;
}
現時点では、DataSourceではなくItemsプロパティを使用しているため、列挙値ごとにAddを呼び出す必要がありますが、それは小さな列挙であり、一時的なコードです。
次に、値に対してConvert.ToInt32を実行し、SelectedIndexで設定します。
一時的な解決策ですが、現時点ではYAGNIです。
アイデアを応援します。顧客からのフィードバックを受け取った後、適切なバージョンを作成するときにそれらを使用するでしょう。
Framework 4では、次のコードを使用できます。
たとえば、MultiColumnMode列挙型をコンボボックスにバインドするには:
cbMultiColumnMode.Properties.Items.AddRange(typeof(MultiColumnMode).GetEnumNames());
そして、選択したインデックスを取得するには:
MultiColumnMode multiColMode = (MultiColumnMode)cbMultiColumnMode.SelectedIndex;
注:この例ではDevExpressコンボボックスを使用していますが、Win Form Comboboxでも同じことができます
この方法でのみキャストを使用します。
if((YouEnum)ComboBoxControl.SelectedItem == YouEnum.Español)
{
//TODO: type you code here
}
おそらくここに古い質問がありますが、問題があり、解決策は簡単でシンプルでした、私はこれを見つけました http://www.c-sharpcorner.com/UploadFile/mahesh/1220/
データビンを利用してうまく動作するので、チェックしてください。
それは常に問題でした。 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
「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
comboBox1.SelectedItem = MyEnum.Something;
うまく動作するはずです... SelectedItem
がnullであることをどのように確認できますか?
拡張メソッドを使用できます
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));
KeyValuePair値のリストをコンボボックスのデータソースとして使用できます。列挙型を指定できるヘルパーメソッドが必要になります。このメソッドは、IEnumerable>を返します。intはenumの値で、stringは列挙値の名前です。コンボボックスで、DisplayMemberプロパティを「Key」に、ValueMemberプロパティを「Value」に設定します。値とキーは、KeyValuePair構造のパブリックプロパティです。その後、SelectedItemプロパティを列挙値に設定すると、動作するはずです。
このパーティーに少し遅れて、
SelectedValue.ToString()メソッドはDisplayedNameをプルする必要があります。ただし、この記事 DataBinding EnumおよびWith Descriptions は、それを取得するだけでなく、必要に応じてカスタムの説明属性を列挙に追加し、表示された値に使用できる便利な方法を示しています。非常にシンプルで簡単で、約15行程度のコードです(中括弧を数えない限り)。
それはかなり気の利いたコードであり、ブートするための拡張方法にすることができます...
comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));
comboBox1.SelectedIndex = (int)MyEnum.Something;
comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something);
私にとってこれらの両方の仕事は、他に何か悪いことはないと確信していますか?
これはおそらく他のすべての応答の中で見られることはありませんが、これは私が思いついたコードです、これはDescriptionAttribute
が存在する場合は使用し、そうでない場合は列挙値自体の名前を使用する利点があります。
既製のキー/値項目パターンがあるため、辞書を使用しました。 List<KeyValuePair<string,object>>
も不要なハッシュなしで機能しますが、辞書を使用するとコードが簡潔になります。
MemberType
of Field
を持ち、リテラルであるメンバーを取得します。これにより、列挙値であるメンバーのみのシーケンスが作成されます。 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";
}
}