Je veux définir DataTextField
et DataValueField
d'un Dropdownlist
(languageList) à l'aide d'un dictionnaire (liste) de languageCod
(en-gb) comme clé et langage nom (anglais) comme texte à afficher.
Code pertinent:
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();
Comment définir DataTextField
et DataValueField
?
Ainsi, vous pouvez définir DataTextField et DataValueField de DropDownList en utilisant les textes "Key" et "Value":
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();
Quand un dictionnaire est énuméré, il donnera KeyValuePair<TKey,TValue>
objets ... il vous suffit donc de spécifier "Valeur" et "Clé" pour DataTextField
et DataValueField
, respectivement, pour sélectionner Valeur / clé propriétés.
Grâce au commentaire de Joe, j'ai relu la question pour bien les interpréter. Normalement, je m'attendrais à ce que la "clé" du dictionnaire soit le texte affiché et la "valeur" la valeur extraite. Votre exemple de code les utilise cependant dans l'autre sens. À moins que vous n'ayez vraiment besoin qu'ils soient ainsi, vous pouvez envisager d'écrire votre code comme suit:
list.Add(cul.DisplayName, cod);
(Et puis changer la liaison pour utiliser "Key" pour DataTextField
et "Value" pour DataValueField
, bien sûr.)
En fait, je suggérerais que, comme il semble que vous souhaitiez réellement une liste plutôt qu'un dictionnaire, vous voudrez peut-être reconsidérer l'utilisation d'un dictionnaire dans première place. Vous pouvez simplement utiliser un 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));
}
Vous pouvez également utiliser une liste de valeurs simples CultureInfo
. LINQ rend cela vraiment facile:
var cultures = service.LanguagesAvailable()
.Select(language => new CultureInfo(language));
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();
Si vous n'utilisez pas LINQ, vous pouvez toujours utiliser une boucle foreach normale:
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();
Si la liste DropDownList est déclarée dans votre page aspx et non dans le codeBear, vous pouvez le faire comme ceci.
.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
}
};
Il suffit d'utiliser "Key" et "Value"