2010-03-10 3 views

risposta

61

Definire una classe

public class Language 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

poi ...

//Build a list 
var dataSource = new List<Language>(); 
dataSource.Add(new Language() { Name = "blah", Value = "blah" }); 
dataSource.Add(new Language() { Name = "blah", Value = "blah" }); 
dataSource.Add(new Language() { Name = "blah", Value = "blah" }); 

//Setup data binding 
this.comboBox1.DataSource = dataSource; 
this.comboBox1.DisplayMember = "Name"; 
this.comboBox1.ValueMember = "Value"; 

// make it readonly 
this.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; 
+5

{get; impostato; } è importante qui. – pbies

+0

@pbies grazie, commento molto utile! –

5

Impostare le proprietà ValueMember/DisplayMember sul nome delle proprietà degli oggetti Language.

class Language 
{ 
    string text; 
    string value; 

    public string Text 
    { 
     get 
     { 
      return text; 
     } 
    } 

    public string Value 
    { 
     get 
     { 
      return value; 
     } 
    } 

    public Language(string text, string value) 
    { 
     this.text = text; 
     this.value = value; 
    } 
} 

... 

combo.DisplayMember= "Text"; 
combo.ValueMember = "Value"; 
combo.Items.Add(new Language("English", "en")); 
+0

questo non funzionerà, è necessario utilizzare le proprietà per questo, non è pura variabile – Fredou

+0

@Fredou: ho risolto questo. Grazie! – thelost

16

Creare una classe di lingua

public class Language 
{ 
    public string Name{get;set;} 
    public string Value{get;set;} 
    public override string ToString() { return this.Name;} 
} 

Quindi, aggiungere come molti linguaggio per la casella combinata che si desidera:

yourCombobox.Items.Add(new Language{Name="English",Value="En"}); 
+0

@Gregoire non visualizzerà "Inglese" come testo visualizzato nella casella combinata. – James

+0

@James: corretto, grazie – Gregoire

+0

+1 Ma ho scritto la stringa di override pubblica ToString() {return this.Name + "/" + this.Value;} invece. – Javier

3
Language[] items = new Language[]{new Language("English", "En"), 
       new Language("Italian", "It")}; 

      languagesCombo.ValueMember = "Alias"; 
      languagesCombo.DisplayMember = "FullName"; 
      languagesCombo.DataSource = items.ToList(); 

      languagesCombo.DropDownStyle = ComboBoxStyle.DropDownList; 

class Language 
    { 
     public string FullName { get; set; } 
     public string Alias { get; set; } 

     public Language(string fullName, string alias) 
     { 
      this.FullName = fullName; 
      this.Alias = alias; 
     } 
    } 

Rendendo la casella a discesa "read solo "Suppongo che tu voglia impedire che gli utenti digitino in altre opzioni anziché essere completamente di sola lettura in cui gli utenti non possano selezionare un valore ??

Se si desidera che sia completamente di sola lettura, è possibile impostare la proprietà attivata su false.

+0

@ MarkB29: Abilitato = falso impedirà all'utente di entrare nel ComboBox per selezionare la lingua che desidera. Questa non è sicuramente una buona cosa. Immagino che mouthpiec desideri che l'utente sia in grado di selezionare la sua lingua, anche se Enabled = false non lo consentirà. Per impostare un controllo ComboBox in sola lettura, è necessario impostare la proprietà DropDownStyle su DropDownStyle.DropDownList. –

+0

@Will Marcouiller: In realtà ho messo questo nella mia risposta. – MarkB29

+0

Sì, davvero. Si prega di scusare la mia incomprensione, ma dopo l'esempio del codice della tua risposta, si specifica di impostare la proprietà Enabled su false per renderla completamente readonly, che nel mio punto di vista disabilitare un ComboBox non rende alcun vantaggio, come farebbe una semplice etichetta lavoro. Questo è ciò che intendevo. Forse mi manca qualcosa della tua intenzione. –

4

Per renderlo di sola lettura, la proprietà DropDownStyle su DropDownStyle.DropDownList.

Per popolare il ComboBox, è necessario avere un oggetto come il linguaggio o giù di lì che contiene sia per esempio:

public class Language { 
    public string Name { get; set; } 
    public string Code { get; set; } 
} 

Poi, si può associare un IList alla vostra proprietà ComboBox.DataSource in questo modo:

IList<Language> languages = new List<Language>(); 
languages.Add(new Language("English", "en")); 
languages.Add(new Language("French", "fr")); 

ComboxBox.DataSource = languages; 
ComboBox.DisplayMember = "Name"; 
ComboBox.ValueMember = "Code"; 

Questo farà esattamente quello che ti aspetti.

2

Che cosa si potrebbe fare è creare una nuova classe, simile a @ l'esempio di Gregoire, tuttavia, si vorrebbe ignorare il ToString() metodo in modo che appaia correttamente nella casella combinata es

public class Language 
{ 
    private string _name; 
    private string _code; 

    public Language(string name, string code) 
    { 
     _name = name; 
     _code = code; 
    } 

    public string Name { get { return _name; } } 
    public string Code { get { return _code; } } 
    public override void ToString() 
    { 
     return _name; 
    } 
} 
1

Se si vuole semplicemente aggiungere che, senza la creazione di una nuova classe di provare questo:

// WPF 
<ComboBox Name="language" Loaded="language_Loaded" /> 


// C# code 
private void language_Loaded(object sender, RoutedEventArgs e) 
{ 
    List<String> language= new List<string>(); 
    language.Add("English"); 
    language.Add("Spanish"); 
    language.Add("ect"); 
    this.chartReviewComboxBox.ItemsSource = language; 
} 

suggerisco un file XML con tutte le lingue che si sosterrà in questo modo non c'è bisogno di dipendere da C# Definirei definitivamente una classe per languge come suggerito dal programmatore di cui sopra.

1

Non c'è bisogno di usare una particolare classe di lingua,

Basta sostituirlo con:

KeyValuePair<string,string> 
0

, ma non è vero basta avere la vostra combo nome del box e poi items.add("")?

Per esempio

Language.Items.Add("Italian"); 
Language.Items.Add("English"); 
Language.Items.Add("Spanish"); 

Spero che questo ha aiutato: D