Domanda

Al momento ho una classe e sto cercando di creare una GUI semplice per creare una raccolta di questa classe.La maggior parte degli attributi di questa classe sono stringhe.Tuttavia, uno degli attributi che desidero che l'utente possa impostare è un Enum.Pertanto, vorrei che l'interfaccia utente avesse un elenco a discesa per questa enumerazione, per impedire all'utente di inserire un valore non valido.Attualmente sto prendendo l'elenco iniziale di oggetti, aggiungendoli a un DataTable e impostando il DataSource del mio DataGridView sulla tabella.Funziona bene, crea anche una colonna di caselle di controllo per l'unica proprietà booleana.Ma non so come trasformare la colonna per l'enumerazione in un elenco a discesa.Sto usando C# e .NET 2.0.

Inoltre, ho provato ad assegnare DataSource di DataGridView all'elenco dei miei oggetti, ma quando lo faccio, non aiuta con l'enumerazione e non riesco a creare nuove righe in DataGridView, ma sicuramente non lo sono vincolato a utilizzare un DataTable come DataSource, era semplicemente l'opzione che avevo semi-funzionante.

È stato utile?

Soluzione

Non so se funzionerebbe con una colonna DataGridView ma funziona con ComboBox:

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

E:

MyEnum value = (MyEnum)comboBox1.SelectedValue;

AGGIORNAMENTO:Funziona anche con le colonne DataGridView, ricorda solo di impostare il tipo di valore.

DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();
col.Name = "My Enum Column";
col.DataSource = Enum.GetValues(typeof(MyEnum));
col.ValueType = typeof(MyEnum);
dataGridView1.Columns.Add(col);

Altri suggerimenti

Oppure, se è necessario filtrare i valori dell'enumeratore, è possibile eseguire il loop Enum.GetValues(typeof(EnumeratorName)) e aggiungi quelli che desideri utilizzando:

dataGridViewComboBoxColumn.Items.Add(EnumeratorValue)

Per inciso, invece di utilizzare un DataTable, è possibile impostare DataSource di DataGridView su un oggetto BindingSource, con DataSource dell'oggetto BindingSource impostato su a BindingList<Your Class>, che popoli passando un IList nel costruttore.

In realtà, sarei interessato a sapere da qualcuno se è preferibile utilizzare un DataTable in situazioni in cui non ne hai già uno (ad es.viene restituito da una chiamata al database).

    if(e.KeyCode == Keys.Oem3)
    {

    }

Questo ha funzionato per me

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top