C # DropDownList com um dicionário como DataSource
-
03-07-2019 - |
Pergunta
Eu quero DataTextField
set e DataValueField
de um Dropdownlist
(LanguageList) usando um dicionário (lista) de languageCod
(en-gb) como chave e nome de idioma (Inglês) como o texto para mostrar.
código relevante:
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();
Como posso definir DataTextField
e DataValueField
?
Solução
Como que você pode definir DataTextField e DataValueField de DropDownList usando "Key" e textos "valor":
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();
Outras dicas
Quando um dicionário é enumerada, que irá produzir KeyValuePair<TKey,TValue>
objectos. .. assim você só precisa especificar "Valor" e "Key" para DataTextField
e DataValueField
respectivamente, para selecionar o Valor / propriedades chave .
Graças ao comentário de Joe, reli a questão para obter estes a volta direita. Normalmente eu esperaria a "chave" no dicionário a ser o texto que é exibido, e o "valor" para ser o valor buscado. Seu código de exemplo usa-los de outra maneira embora. A menos que você realmente precisa deles para ser dessa maneira, você pode querer considerar escrever seu código como:
list.Add(cul.DisplayName, cod);
(E em seguida, alterando a ligação de usar "chave" para DataTextField
e "Valor" para DataValueField
, é claro.)
Na verdade, eu sugiro que, como parece que você realmente deseja fazer um lista ??em> em vez de um dicionário, você pode querer reconsiderar usando um dicionário em primeiro lugar. Você pode simplesmente usar um List<KeyValuePair<string, string>>
:
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));
}
Como alternativa, use uma lista de valores CultureInfo
simples. LINQ torna isso muito fácil:
var cultures = service.LanguagesAvailable()
.Select(language => new CultureInfo(language));
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();
Se você não estiver usando LINQ, você ainda pode usar um loop foreach normal:
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 o DropDownList é declarado em sua página aspx e não no codebehind, você pode fazê-lo assim.
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
}
};
Apenas use "Key" e "Valor"