DropDownList C # con un dizionario come DataSource
-
03-07-2019 - |
Domanda
Voglio impostare DataTextField
e DataValueField
di un Dropdownlist
(Elenco lingue) usando un Dizionario (elenco) di languageCod
(en-gb) come nome chiave e lingua (inglese) come testo da visualizzare .
Codice rilevante:
string[] languageCodsList= service.LanguagesAvailable();
Dictionary<string, string> list =
new Dictionary<string, string>(languageCodsList.Length);
foreach (string cod in languageCodsList)
{
CultureInfo cul = new CultureInfo(cod);
list.Add(cod, cul.DisplayName);
}
languageList.DataSource = list;
languageList.DataBind();
Come posso impostare <=> e <=>?
Soluzione
In questo modo puoi impostare DataTextField e DataValueField di DropDownList usando " Key " e " Valore " testi:
Dictionary<string, string> list = new Dictionary<string, string>();
list.Add("item 1", "Item 1");
list.Add("item 2", "Item 2");
list.Add("item 3", "Item 3");
list.Add("item 4", "Item 4");
ddl.DataSource = list;
ddl.DataTextField = "Value";
ddl.DataValueField = "Key";
ddl.DataBind();
Altri suggerimenti
Quando un dizionario viene elencato, verrà visualizzato KeyValuePair<TKey,TValue>
oggetti ... quindi devi solo specificare " Valore " e " Chiave " per DataTextField
e DataValueField
, rispettivamente, per selezionare Value / Proprietà chiave
Grazie al commento di Joe, rileggo la domanda per farli girare nel modo giusto. Normalmente mi aspetto il & Quot; chiave & Quot; nel dizionario come testo visualizzato e " valore " essere il valore recuperato. Il tuo codice di esempio li usa viceversa. A meno che tu non abbia davvero bisogno che siano così, potresti considerare di scrivere il tuo codice come:
list.Add(cul.DisplayName, cod);
(E quindi cambiando l'associazione per usare " Chiave " per List<KeyValuePair<string, string>>
e " Valore " per CultureInfo
, ovviamente.)
In effetti, suggerirei che siccome sembra che tu voglia davvero un elenco piuttosto che un dizionario, potresti voler riconsiderare usando un dizionario in primo luogo. Puoi semplicemente usare un <=>:
string[] languageCodsList = service.LanguagesAvailable();
var list = new List<KeyValuePair<string, string>>();
foreach (string cod in languageCodsList)
{
CultureInfo cul = new CultureInfo(cod);
list.Add(new KeyValuePair<string, string>(cul.DisplayName, cod));
}
In alternativa, utilizzare un elenco di valori <=> semplici. LINQ rende tutto molto semplice:
var cultures = service.LanguagesAvailable()
.Select(language => new CultureInfo(language));
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();
Se non si utilizza LINQ, è comunque possibile utilizzare un normale ciclo foreach:
List<CultureInfo> cultures = new List<CultureInfo>();
foreach (string cod in service.LanguagesAvailable())
{
cultures.Add(new CultureInfo(cod));
}
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();
Se il DropDownList è dichiarato nella tua pagina aspx e non nel codebehind, puoi farlo in questo modo.
aspx:
<asp:DropDownList ID="ddlStatus" runat="server" DataSource="<%# Statuses %>"
DataValueField="Key" DataTextField="Value"></asp:DropDownList>
.aspx.cs:
protected void Page_Load(object sender, EventArgs e)
{
ddlStatus.DataBind();
// or use Page.DataBind() to bind everything
}
public Dictionary<int, string> Statuses
{
get
{
// do database/webservice lookup here to populate Dictionary
}
};
Basta usare " Tasto " e " Valore "