Выпадающий список C # со словарем в качестве источника данных
-
03-07-2019 - |
Вопрос
Я хочу установить DataTextField
и DataValueField
из a 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
?
Решение
Таким образом, вы можете установить DataTextField и DataValueField выпадающего списка, используя тексты "Ключ" и "Значение" :
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();
Другие советы
Когда словарь будет перечислен, он выдаст KeyValuePair<TKey,TValue>
Объекты...таким образом, вам просто нужно указать "Значение" и "Ключ" для DataTextField
и DataValueField
соответственно, для выбора Значение/Клавиша свойства.
Благодаря комментарию Джо, я перечитал вопрос, чтобы разобраться в нем правильно.Обычно я бы ожидал, что "ключом" в словаре будет отображаемый текст, а "значением" - полученное значение.Однако в вашем примере кода они используются наоборот.Если вам действительно не нужно, чтобы они были такими, вы можете рассмотреть возможность написания своего кода следующим образом:
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();
Если выпадающий список объявлен на вашей странице 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
}
};
Просто используйте "Ключ" и "Значение".