Здесь есть хорошие ответы, но я чувствовал необходимость включить больше информации, потому что есть несколько вариантов, которые работают, и нам нужно решить, какой использовать.
Во-первых, мы должны понять AppendDataBoundItems
. Если AppendDataBoundItems = "true"
, ListItems
добавляются к DropDownList
без очистки старых. В противном случае DropDownList
очищается перед следующим DataBind
. MSDN AppendDataBoundItems doc
В основном ответы охватывают 2 варианта:
1. Определите пустую опцию в html и добавьте ListItems из базы данных в DropDownList только один раз.
Обратите внимание на 3 вещи здесь:
- Пробел
ListItem
определен в html
AppendDataBoundItems="true"
DataBind
НЕ вызывается на обратных передачах или когда элемент DropDownList
количество> 1
Источник:
<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
<asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>
Код позади:
protected void Page_Load(object sender, System.EventArgs e)
{
if (MyList.Items.Count <= 1 ) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
Примечание: мне нравится логика проверки счета против проверки IsPostBack
. Хотя PostBacks часто являются причиной дублирования привязки данных, это может быть вызвано другими способами. Проверка количества элементов - это просто проверка того, загружен ли он уже.
ИЛИ (можно использовать IsPostBack
вместо)
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
2. Очистите и перезагрузите DropDownList при каждом обновлении страницы.
Обратите внимание на 3 отличия от первого варианта:
AppendDataBoundItems="false"
(если он не определен, то false
это
значение по умолчанию)
- Пробел
ListItem
добавляется в коде позади. Мы не можем определить это в HTML
потому что с AppendDataBoundItems="false"
это будет очищено.
DataBind
вызывается на каждый Page_Load
Источник:
<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name"
OnDataBound="MyList_DataBound" >
</asp:DropDownList>
Код:
protected void Page_Load(object sender, System.EventArgs e)
{
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
protected void MyList_DataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select One -", ""));
}