[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?




È 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.




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




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?




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



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




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






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

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

Sorgente completa ... Associazione di enum a Combobox




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
}



Links