[C#] Associare un enum a una casella combinata WinForms e quindi impostarlo


Answers

Il codice

comboBox1.SelectedItem = MyEnum.Something;

è ok, il problema deve risiedere nel DataBinding. Gli assegnamenti DataBinding si verificano dopo il costruttore, principalmente la prima volta che viene visualizzata la casella combinata. Prova a impostare il valore nell'evento Load. Ad esempio, aggiungi questo codice:

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

E controlla se funziona.

Question

un sacco di persone hanno risposto alla domanda su come associare un enum a una casella combinata in WinForms. È così:

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

Ma è abbastanza inutile senza poter impostare il valore reale da visualizzare.

Ho provato:

comboBox1.SelectedItem = MyEnum.Something; // Does not work. SelectedItem remains null

Ho anche provato:

comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something); // ArgumentOutOfRangeException, SelectedIndex remains -1

Qualcuno ha qualche idea su come farlo?




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
}



Metodo generico per impostare un enum come origine dati per i drop down

La visualizzazione sarebbe il nome. Il valore selezionato sarebbe Enum stesso

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



È possibile utilizzare un elenco di valori KeyValuePair come origine dati per la casella combinata. È necessario un metodo di supporto in cui è possibile specificare il tipo di enum e restituisce IEnumerable> dove int è il valore di enum e string è il nome del valore enum. Nella tua casella combinata, imposta la proprietà DisplayMember su "Chiave" e la proprietà ValueMember su "Valore". Valore e chiave sono proprietà pubbliche della struttura KeyValuePair. Quindi quando si imposta la proprietà SelectedItem su un valore enum come si sta facendo, dovrebbe funzionare.




Io uso il seguente metodo di supporto, che puoi associare alla tua lista.

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



Prova questo:

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

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

StoreObject è il mio esempio di oggetto con la proprietà StoreObjectMyEnumField per il valore MyEnum del negozio.




comboBox1.SelectedItem = MyEnum.Something;

dovrebbe funzionare bene ... Come puoi dire che SelectedItem è nullo?




Per semplificare:

Innanzitutto inizializza questo comando: (ad es. Dopo InitalizeComponent() )

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

Per recuperare l'oggetto selezionato sulla casella combinata
YourEnum enum = (YourEnum) yourComboBox.SelectedItem

Se si desidera impostare il valore per la casella combinata
yourComboBox.SelectedItem = YourEnem.Foo







In Framework 4 è possibile utilizzare il seguente codice:

Ad esempio, collegare enum MultiColumnMode a combobox:

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

e per ottenere l'indice selezionato:

MultiColumnMode multiColMode = (MultiColumnMode)cbMultiColumnMode.SelectedIndex;

nota: utilizzo la casella combinata DevExpress in questo esempio, è possibile fare lo stesso in Win Combobox




    public enum Colors
    {
        Red = 10,
        Blue = 20,
        Green = 30,
        Yellow = 40,
    }

comboBox1.DataSource = Enum.GetValues(typeof(Colors));

Sorgente completa ... Associazione di enum a Combobox