我正在开发一些网页应用,在我的一个内容网页上,我需要一个搜索功能。我使用2个DropDownLists(一个用于类别,一个用于搜索参数)和一个TextBox。
问题是,当我从ddlCategory中选择值时,我需要一个回发(因为它过滤了显示的数据库中的数据,即零件,程序集......)。如果TextBox中没有任何内容(没有要搜索的文本),我没有问题。但是当TextBox中有一些文本时,它会被清除,并再次显示该类别中的所有数据,我需要再次输入搜索参数。你明白这是什么问题吗? :)如何解决这个问题?
以下是相关代码:
<asp:DropDownList ID="ddlCategory" runat="server" AutoPostBack="true" onselectedindexchanged="ddlCategory_SelectedIndexChanged">
</asp:DropDownList>
<asp:TextBox ID="tbSrch" runat="server"></asp:TextBox>
<asp:DropDownList ID="ddlSrch" runat="server">
</asp:DropDownList>
<asp:Button ID="btnSrch" runat="server" Text="Search" onclick="btnSrch_Click" />
//here is code behind:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindGridView(); //bind data from SQL DB to GV
if (Session["ddlCategory"] != null) //I need a persistent dropdown list
{
BindDropDownLists();
ddlCategory.SelectedValue = (string)Session["ddlCategory"];
}
else
{
BindDropDownLists();
}
}
}
private void BindGridView()
{
//Get data from database based on Category and search parameters and bind it to the GV
}
private void BindDropDownLists() //bind DDLs
{
ddlKategorija.Items.Add("Value1");
ddlKategorija.Items.Add("Value2");
ddlKategorija.Items.Add("Value3");
ddlKategorija.Items.Add("Value4");
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable table = new DataTable();
cmd.CommandText = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = 'MyTable'";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
da.Fill(table);
foreach (DataRow row in table.Rows)
{
ddlSrch.Items.Add(row[0].ToString());
}
}
protected void btnSrch_Click(object sender, EventArgs e)
{
BindGridView();
}
protected void ddlKategorija_SelectedIndexChanged(object sender, EventArgs e)
{
Session["ddlCategory"] = ddlCategory.SelectedValue;
Response.Redirect(Request.RawUrl);
}
答案 0 :(得分:4)
不要Response.Redirect(Request.RawUrl);
。这将从新鲜加载页面并清空您的文本框。
在ddlKategorija_SelectedIndexChanged
事件中,该页面已经回发了。此时,包含文本框的控件已从ViewState重新填充。通过此时进行重定向,您将再次重新加载页面,但这次就好像它已经第一次加载一样。因此,所有控件都将为空白。
只需删除Response.Redirect
行,一切顺利。