ASP.. NET SqlDataSource过滤器行为

本文关键字:过滤器 SqlDataSource NET ASP | 更新日期: 2023-09-27 18:01:54

我有一个GridView对象通过SqlDataSource馈送。以同样的形式,我也有一些TextBoxes用于为数据源构建过滤表达式。过滤通过按Button启动。

<asp:GridView
    DataSourceID="sdsTable1"
    OnSorting="gvTable1_Sorting"
    OnPageIndexChanging="gvTable1_PageIndexChanging"
    runat="server"
    CssClass="list_table"
    ID="_gvTable1"
    CellPadding="0" CellSpacing="0"
    AutoGenerateColumns="false"
    EmptyDataText="No data."
    ShowHeader="true" ShowFooter="true"
    AllowSorting="true"
    AllowPaging="true"
    PageSize="10" 
    OnRowDataBound="gvTable1_RowDataBound" >
    <HeaderStyle CssClass="header" />
    <FooterStyle CssClass="footer" />
    <PagerSettings
        Visible="true"
        Mode="NumericFirstLast"
        PageButtonCount="3"
        Position="Bottom"
        NextPageText="Next page"
        PreviousPageText="Prev page"
        FirstPageText="First page"
        LastPageText="Last page" />
    <RowStyle CssClass="odd" />
    <AlternatingRowStyle CssClass="even" />
    <PagerStyle HorizontalAlign="Center" />
    <Columns>
        <asp:TemplateField Visible="false">
         <HeaderTemplate>&nbsp;</HeaderTemplate>
         <ItemTemplate>
          <%#Eval("id")%>
         </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Date" SortExpression="date">
         <ItemTemplate>
          <%#Eval("date","{0:dd/MM/yyyy HH:mm:ss}")%>
         </ItemTemplate>
         <FooterTemplate>
          TOTALE:
         </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Price" SortExpression="price">
         <ItemTemplate>
          <asp:Label ID="lblPrice" runat="server" Text='<%# Bind("price","{0:F2} &euro;") %>'>></asp:Label>
         </ItemTemplate>
         <FooterTemplate>
          <asp:Label ID="lblTotal" runat="server" Text="0"></asp:Label
         </FooterTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="description" HeaderText="Description" SortExpression="description" />
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="sdsTable1" runat="server"
    ConnectionString="<%$ ConnectionStrings:_db %>"
    ProviderName="<%$ ConnectionStrings:_db.ProviderName %>"
    DataSourceMode="DataSet"
    SelectCommand=" SELECT id, id_user, price, description FROM view1 WHERE id_user = @id_user;">
    <SelectParameters>
        <asp:SessionParameter Type="Int32" Name="id_user" SessionField="USER_ID" />
    </SelectParameters>
</asp:SqlDataSource>

在代码后面(在与上面提到的Button相关联的事件处理程序中),我用以下代码构建链接TextBoxes值的过滤器表达式:

    if (!string.IsNullOrWhiteSpace(_txtFilter0.Text.Trim()))
    {
        _sFilter += "(description LIKE '%" + _txtFilter0.Text.Trim() + "%')";
    }
    if (!string.IsNullOrWhiteSpace(_txtFilter1.Text.Trim()))
    {
        if (!string.IsNullOrWhiteSpace(_sFilter))
            _sFilter += " AND";
        _sFilter += "(description LIKE '%" + _txtFilter1.Text.Trim() + "%')";
    }
    sdsTable1.FilterExpression = _sFilter;

一切正常,直到我清除导致空过滤器的字段,在这种情况下,我希望检索所有记录,但由于某种原因,在这种情况下,最后一个记录集被保留并毫无原因地明显显示。

我也尝试禁用SQLDataSource缓存功能没有运气:

    EnableCaching="false"

我也试着发出一个Select命令,再次没有运气:

 sdsTable1.Select(DataSourceSelectArguments.Empty);

我错在哪里?

ASP.. NET SqlDataSource过滤器行为

您的_sFilter属性将在回发中持久化,因此只有当您的过滤器文本框不是为空时才更新它,当您清除它们时,它将保持在最后设置的值。在代码中_sdsTable1.FilterExpression = _sFilter;行设置一个断点应该可以确认这一点。

要解决这个问题,要么在事件处理程序中重新构建_sFilter属性之前清除它,要么编写一个额外的检查:

if (string.IsNullOrWhiteSpace(_txtFilter1.Text.Trim()) & string.IsNullOrWhiteSpace(_txtFilter0.Text.Trim()) )
{
  _sFilter = null;
}