2014-12-31 37 views
6

Sono nuovo di utilizzare Visual Studio/WinForms/C#Come creare un menu a discesa in WinForms e C#

Sto cercando di creare un semplice menu a tendina in cui ogni valore può avere un valore e un'etichetta.

Questo è quello che farei in HTML se stavo creando un'app web. Ma come posso farlo con C# e WinForms?

<select> 
<option value="0">Please select One</option> 
<option value="1">The first Options</option> 
<option value="2">The Second Options</option> 
<option value="3">The Third Options</option> 
</select> 

ho cercato ComboBox ma sembra non mi è permesso di aggiungere un valore e un'etichetta e l'utente può comunque digitare tutto ciò che vogliono.

Ho provato un ListBox ma questo non mi ha permesso di usare anche il valore e l'etichetta.

+0

Il titolo e la descrizione sono confuse. Questo non ha nulla a che fare con i menu. –

+0

La tua migliore scommessa è quella di riempire gli elementi con le stringhe che vuoi visualizzare, quindi nel codice hai solo delle condizioni basate su ciò che l'utente ha selezionato. – Baddack

risposta

10

Se si desidera un valore e una didascalia (etichetta), creare una classe appropriata

class ComboItem 
{ 
    public int ID { get; set; } 
    public string Text { get; set; } 
} 

Nel ComboBox si quindi impostare la proprietà DisplayMember al Text e la ValueMember proprietà ID.


Il DropDownStyle del ComboBox ne determina il comportamento. DropDownStyle.DropDown consente all'utente di digitare testo. Con DropDownStyle.DropDownList l'utente può solo selezionare elementi dall'elenco.


si può riempire il ComboBox in questo modo:

myCombo.DataSource = new ComboItem[] { 
    new ComboItem{ ID = 1, Text = "One" }, 
    new ComboItem{ ID = 2, Text = "Two" }, 
    new ComboItem{ ID = 3, Text = "Three" } 
}; 

Il DataSource può essere qualsiasi tipo di enumerabile.

È possibile recuperare l'ID selezionato come questo

int id = (int)myComboBox.SelectedValue; 

Si noti che è possibile aggiungere qualsiasi tipo di elemento da ComboBox. Se non si specificano le proprietà DisplayMember e ValueMember, il ComboBox utilizza il metodo ToString dell'oggetto per determinare il testo visualizzato ed è possibile recuperare l'elemento selezionato (valore non selezionato) tramite la proprietà SelectedItem.

Se si aggiungono oggetti di questo tipo ...

class Person 
{ 
    public int PersonID { get; set } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public override string ToString() 
    { 
     return FirstName + " " + LastName; 
    } 
} 

... al ComboBox, è possibile recuperare l'elemento selezionato come questo

Person selectedPerson = (Person)myComboBox.SelectedItem; 
int personID = selectedPerson.PersonID; 

Il ComboBox visualizza il primo e cognomi delle persone.

+0

Grazie per il vostro aiuto. Dopo aver applicato il tuo codice, sto vedendo l'opzione 3 con la seguente opzione di testo '" POS.ComboItem "' dove 'POS' è lo spazio dei nomi dovrei vedere' "Uno", "due", "Tre" ' – Jaylen

+0

Funziona per me. Sostituisci 'ToString' o definisci la proprietà' DisplayMember'. Ho scritto 'comboBox1.DisplayMember =" Testo "; \t \t \t comboBox1.ValueMember = "ID"; ', ma è possibile impostare queste proprietà anche nella finestra delle proprietà. –

+0

ha funzionato ora :) grazie mille – Jaylen

0

ComboBox visualizza i risultati restituiti dalla chiamata ToString, in modo da poter definire una classe Display che racchiuda il valore e visualizzi il testo e li aggiunga alla casella combinata.

Cioè:

public class ItemDisplay<TValue> 
{ 
    private readonly string m_displayText; 

    public ItemDisplay(TValue value, String displayText) 
    { 
     this.Value = value; 
     m_displayText = displayText; 
    } 

    public TValue Value { get; set; } 

    public override string ToString() 
    { 
     return m_displayText; 
    } 
} 

e aggiungere elementi alla tua casella combinata come segue:

comboBox1.Items.Add(new ItemDisplay<int>(1, "FirstValue")); 
comboBox1.Items.Add(new ItemDisplay<int>(2, "Second")); 
comboBox1.Items.Add(new ItemDisplay<int>(3, "Third")); 
3

sembra che il valore è solo un riferimento a quello che elemento è selezionato, giusto? Quindi puoi usare l'indice della casella combinata, lo rende molto più semplice.

Non sicuro se i tuoi articoli sono noti prima della compilazione, se sì, quindi aggiungili nella finestra di progettazione, proprietà della casella combinata. Se no, allora si può aggiungere dinamicamente da solo facendo:

 List<string> items = new List<string>() { "item1", "item2" }; 
     comboBox1.DataSource = items; 

E per sapere quale oggetto è selezionato:

 int index = comboBox1.SelectedIndex; 
+0

In realtà, sto leggendo i valori dal database in cui il valore è l'ID dell'elemento pubblicitario e il testo è il nome dell'elemento letto dal database – Jaylen

2

È necessario impostare un'origine dati per il Combobox, è meglio se si crea una classe e passare un elenco di oggetti, ad esempio:

private void Init() 
{ 
    List<Item> items = new List<Item>(); 
    items.Add(new Item() { Text = "displayText1", Value = "ValueText1" }); 
    items.Add(new Item() { Text = "displayText2", Value = "ValueText2" }); 
    items.Add(new Item() { Text = "displayText3", Value = "ValueText3" }); 

    comboBox1.DataSource = items; 
    comboBox1.DisplayMember = "Text"; 
    comboBox1.ValueMember = "Value"; 

} 

public class Item 
{ 
    public Item() { } 

    public string Value { set; get; } 
    public string Text { set; get; } 
} 

Mettere il metodo Init() nel vostro FormName_Load(object sender, EventArgs e){}.

0

Per creare un menu a discesa nel controller, utilizzare selectlistem nel metodo get. E lo stesso è necessario anche nel metodo Post.

  List<SelectListItem> items = new List<SelectListItem>(); 
      items.Add(new SelectListItem 
      { 
       Text = "car", 
       Value = "car" 
      }); 


      ViewBag.List = new SelectList(items, "Text", "Value"); 

In vista è necessario passare a dropdownlist.

@Html.DropDownList("option", (ViewBag.List as SelectList), "Select", new { @style ="padding:5.5px;margin-bottom:8px;margin-right:-5px;" }) 

`

Problemi correlati