搜索过滤 - DropDownLists和TextBoxes

时间:2012-01-17 17:59:51

标签: c# asp.net

我正在开发一些网页应用,在我的一个内容网页上,我需要一个搜索功能。我使用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);
}

1 个答案:

答案 0 :(得分:4)

不要Response.Redirect(Request.RawUrl);。这将从新鲜加载页面并清空您的文本框。

ddlKategorija_SelectedIndexChanged事件中,该页面已经回发了。此时,包含文本框的控件已从ViewState重新填充。通过此时进行重定向,您将再次重新加载页面,但这次就好像它已经第一次加载一样。因此,所有控件都将为空白。

只需删除Response.Redirect行,一切顺利。