С# DropDownList с словарем как DataSource
Я хочу установить DataTextField
и DataValueField
из Dropdownlist
(languageList), используя словарь (список) languageCod
(en-gb) в качестве имени и имени языка (английский) в качестве текста для отображения.
Соответствующий код:
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();
Как установить DataTextField
и DataValueField
?
Ответы
Ответ 1
Подобным образом вы можете установить DataTextField и DataValueField из DropDownList, используя тексты "Key" и "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();
Ответ 2
Когда словарь перечислит, он даст объекты KeyValuePair<TKey,TValue>
... так что вам просто нужно указать "Значение" и "Ключ" "для DataTextField
и DataValueField
соответственно, чтобы выбрать Значение/ Key.
Благодаря комментарию Джо, я перечитал вопрос, чтобы получить правильное решение. Обычно я ожидаю, что "ключ" в словаре будет отображаемым текстом, а "значение" - значением, которое будет выбрано. Ваш пример кода использует их наоборот. Если вам это действительно не нужно, вы можете подумать о написании своего кода как:
list.Add(cul.DisplayName, cod);
(И затем измените привязку, чтобы использовать "Ключ" для DataTextField
и "Значение" для DataValueField
, конечно.)
На самом деле, я бы предположил, что, как вам кажется, вам действительно нужен список, а не словарь, возможно, вы захотите пересмотреть использование словаря в первую очередь. Вы можете просто использовать 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));
}
В качестве альтернативы используйте список простых значений CultureInfo
. LINQ делает это очень просто:
var cultures = service.LanguagesAvailable()
.Select(language => new CultureInfo(language));
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();
Если вы не используете LINQ, вы можете использовать обычный цикл 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();
Ответ 3
Просто используйте "Key" и "Value"
Ответ 4
Если DropDownList объявлен на вашей странице aspx, а не в коде, вы можете сделать это следующим образом.
.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
}
};