DropDownList AppendDataBoundItems (первый элемент должен быть пустым и без дубликатов)
У меня есть DropDownList
внутри UpdatePanel
который заполняется при обратной передаче из SqlDataSource
. У него есть параметр, который является другим элементом управления. Иногда мне требуется несколько обратных передач, но происходит то, что каждый раз, когда обновляется панель обновления, элементы добавляются в DropDownList
. Таким образом, DropDownList
заканчивается неправильными данными или повторяющимися данными.
У меня свойство AppendDataBoundItems
установлено в true
потому что мне нужно, чтобы первый элемент был пустым.
Как я могу преодолеть эту проблему? Есть ли другой способ получить пустой первый элемент?
(Этот DropDownList
находится в веб-приложении ASP.NET 2.0, а кодовая часть находится в С#)
Ответы
Ответ 1
Вместо использования AppendDataboundItems='true'
(что вызовет проблему, о которой вы говорите) ответьте на событие DataBound
для DropDownList
, а затем добавьте свой "пустой" элемент в начало списка.
<asp:DropDownList runat="server" ID="MyList"
ondatabound="MyListDataBound"></asp:DropDownList>
Затем в вашем коде позади:
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
Ответ 2
Вы, вероятно, привязываете этот DropDownList в коде. Поэтому вы не должны делать это после обратной передачи:
// probably in Page_Load method
if (!Page.IsPostBack)
{
// do data binding here
};
Ответ 3
Здесь есть хорошие ответы, но я почувствовал необходимость включать больше информации, потому что есть несколько вариантов, которые работают, и нам нужно решить, что использовать.
Во-первых, мы должны понимать AppendDataBoundItems
. Если AppendDataBoundItems = "true"
, ListItems
добавляются в DropDownList
, не очищая старые. В противном случае DropDownList
очищается до следующего DataBind
. MSDN AppendDataBoundItems doc
В основном ответы на большинство вариантов:
1. Определите пустой параметр в html и добавьте ListItems из базы данных в DropDownList только один раз.
Обратите внимание на 3 вещи:
- Бланк
ListItem
определяется в html
-
AppendDataBoundItems="true"
-
DataBind
НЕ вызывается при обратном вызове или когда элемент DropDownList
count > 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();
}
}
Примечание. Мне нравится логика проверки count и check 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 -", ""));
}
Ответ 4
Вот идея, мы можем использовать 2 события: DataBound и DataBinding:
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
protected void MyListDataBinding(object sender, EventArgs e)
{
MyList.Items.Items.Clear();
}
Ответ 5
<asp:DropDownList ID="DropDownList1" AppendDataBoundItems="true" runat="server"
DataSourceID="SqlDataSource1" DataTextField="state" DataValueField="state">
<asp:ListItem Text="(Select a State)" Value="" />
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"
SelectCommand="SELECT DISTINCT [state] FROM [authors]">
</asp:SqlDataSource>
Ответ 6
Код работает, попробуйте присвоить ему значение:
MyList.Items.Insert(0, new ListItem("- Select -", "0"));
Ответ 7
Вот идея.
В раскрывающемся списке с именем AutoPostBack
есть свойство, которое присваивает значение true, а затем в коде, позади которого вы помещаете весь метод привязки внутри if(!Page.IsPostBack)
. Это сработало для меня.
С уважением.
Ответ 8
Просто добавьте EnableViewState = "false" в тег Dropdown
<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource"
DataTextField="Name" DataValueField="ID" EnableViewState="false"
AppendDataBoundItems="true">
<asp:ListItem Value="">Select</asp:ListItem>
</asp:DropDownList>