Мой код проекта:
<asp:DropDownList ID ="DropDownList1" runat="server" EnableViewState="true" AutoPostBack ="true" CssClass="ddl" DataSourceID="SqlDataSource1" DataTextField="CategoryName" DataValueField="CategoryId" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT * FROM [Categories]"></asp:SqlDataSource>
Код С#:
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
Response.Redirect("Products.aspx?catId=" + DropDownList1.SelectedValue);
}
В таблице категорий базы данных:
Book 1
Movie 2
Game 3
Music 4
Книга всегда является текущим элементом выпадающего списка. когда я выбираю другие, их загружает страницы, но текущее значение dropdownlist - это книга и страница справки "can'response".
Поскольку вы выполняете перенаправление, это означает, что ваша страница снова загружается с привязкой по умолчанию, что делает первый элемент выбранным по умолчанию, подписывается на связанное с данными событие и выполняет выбор на основе параметра строки запроса.
ASPX
<asp:DropDownList OnDataBound="DropDownList1_DataBound" ...
С#
protected void DropDownList1_DataBound(object sender, EventArgs e)
{
if(!IsPostBack){
string selectedValue = Request.QueryString["catId"];
if(!string.IsNullOrEmpty(selectedValue))
DropDownList1.SelectedValue = selectedValue;
}
}
Я думаю, что проблема в том, что список связывается с SqlDataSource
при каждой обратной передаче, поэтому вы всегда получаете значение первого элемента.
Чтобы убедиться в этой проблеме, измените порядок выбора на DESC и посмотрите, всегда ли вы получаете последний элемент.
измените, что вы SQL
SELECT * FROM [Categories] ORDER BY CategoryId DESC
И посмотрите, всегда ли вы получаете 4
.
Если это проблема, вам нужно привязать список по коду всегда в пределах загрузки страницы, как показано ниже:
if(!Page.IsPostback)
{
// code here
}
Вы можете попробовать два подхода. Или переместите выпадающий код заполнения в Page_Load и инкапсулируйте код с помощью
if(!Page.IsPostBack)
{
//your code
}
или
<%
if(!Page.IsPostBack)
{ %>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT * FROM [Categories]"></asp:SqlDataSource>
<%}
%>
<% %>
, ваш ответ не имеет смысла без них