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?

Foi útil?

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 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"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top