2015-07-09 3 views
0

У меня есть GridView объект, подающий лоток через SqlDataSource. В том же виде у меня также есть ряд текстовых полей, используемых для создания фильтрационного выражения для источника данных. «Фильтрация» запускается нажатием кнопки.Поведение фильтра ASP.NET SqlDataSource

<asp:GridView 
    DataSourceID="_sdsTable1" 
    OnSorting="_gvTable1_Sorting" 
    OnPageIndexChanging="_gvMovimenti_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="_gvMovimenti_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 %>" 
    SelectCommand=" SELECT * FROM view1 WHERE id_user = @id_user;"> 
    <SelectParameters> 
     <asp:SessionParameter Type="Int32" Name="id_user" SessionField="USER_ID" /> 
    </SelectParameters> 
</asp:SqlDataSource> 

В коде (в hanlder событий, связанный с «кнопкой», упомянутой выше) Я застроить выражение фильтра формирования цепочки значения TextBox, с помощью этого кода:

if (!string.IsNullOrWhiteSpace(_txtFilter0.Text.Trim())) 
    { 
     _sFilter += "(descrizione LIKE '%" + _txtFilter0.Text.Trim() + "%')"; 
    } 

    if (!string.IsNullOrWhiteSpace(_txtFilter1.Text.Trim())) 
    { 
     if (!string.IsNullOrWhiteSpace(_sFilter)) 
      _sFilter += " AND"; 

     _sFilter += "(descrizione LIKE '%" + _txtFilter1.Text.Trim() + "%')"; 
    } 

    _sdsTable1.FilterExpression = _sFilter; 

Все работает, пока не ясно поля, которые приводят к пустому фильтру. Я ожидал получить все данные. По какой-то причине в этом случае последний набор записей сохраняется и отображается, по-видимому, без причины.

Я пытался также отключить функцию кэширования SqlDataSource без везения:

EnableCaching="false" 

Я попытался также выдать команду Select, снова не повезло:

_sdsCrediti.Select(DataSourceSelectArguments.Empty); 

Где я ошибаюсь?

+0

Бэкэнд является MySQL – weirdgyn

+0

Чтобы быть точнее 'SQLDataSource' использовать 'View' вместо таблицы. – weirdgyn

+1

Похож, что '_sFilter' не возвращается к нулевому значению, если поля поиска очищаются. Вероятно, он по-прежнему содержит последнее предложение фильтра, поскольку оно изменяется только в том случае, если поля НЕ пусты. Убедитесь, что вы сбросили его. – Crowcoder

ответ

1

Свойство _sFilter будет сохраняться через postbacks, так как вы обновляете его только тогда, когда текстовые поля фильтра не пустым, он останется при последнем установленном значении, когда вы их очистите. Постановка контрольной точки в код на строке _sdsTable1.FilterExpression = _sFilter; должна подтвердить это.

Чтобы решить эту проблему, либо очистить свойство _sFilter прежде, чем восстановление его в обработчик события, или написать дополнительную проверку:

сервер
if (string.IsNullOrWhiteSpace(_txtFilter1.Text.Trim()) & string.IsNullOrWhiteSpace(_txtFilter0.Text.Trim())) 
{ 
    _sFilter = null; 
} 
+0

@Crowcoder - настоящая проблема не в том, что ... '_sFilter' сбрасывался до' '' 'каждый раз, когда был обработан обработчик событий. Но вы действительно приблизились к реальной проблеме, так как для принудительного «SQLDataSouce» для «сброса» мне пришлось установить 'FilterExpression' в' null' ... но ваше решение было правильным. – weirdgyn

Смежные вопросы