Программное удаление фильтра контекстного меню заголовка из RadGrid
У меня есть повторитель, который я привязал к именам столбцов, которые фильтруются по мере их применения (в настоящее время, используя сеансы, я мог бы изменить это, чтобы циклически проходить по столбцам в поисках фильтров, теперь я действительно знаю, как работает сетка).
У меня есть кнопка рядом с именем каждого отфильтрованного столбца, чтобы удалить фильтр из RadGrid.
<asp:Repeater ID="repCorpFilters" runat="server" OnItemCommand="repFilters_ItemCommand">
<HeaderTemplate>
Current Filters:
</HeaderTemplate>
<ItemTemplate>
<asp:ImageButton runat="server" CommandName="removefilter" CommandArgument="corp" ImageUrl="../images/Delete.gif" />
<asp:literal ID="litFilter" runat="server" Text='<%#Container.DataItem() %>' />
</ItemTemplate>
<SeparatorTemplate>
,
</SeparatorTemplate>
</asp:Repeater>
Protected Sub repFilters_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.RepeaterCommandEventArgs)
Select Case e.CommandName
Case "removefilter"
BindGrid(DirectCast([Enum].Parse(GetType(products), e.CommandArgument), products), Nothing, _
CType(e.Item.FindControl("litFilter"), Literal).Text)
End Select
End Sub
Private Sub BindGrid(ByVal prod As products, Optional ByVal cusipFilter As String = Nothing, Optional ByVal strRemoveFilter As String = Nothing)
Dim dvCorp As DataView = CachedPartialCorp()
If Not IsNothing(cusipFilter) Then
isCusipFiltered = True
dvCorp.RowFilter = "CUSIP IN " & cusipFilter
End If
If Not IsNothing(strRemoveFilter) Then
Dim filters As List(Of String) = RemoveFilter("partialCorpFilters", strRemoveFilter)
If filters.Count = 0 Then
repCorpFilters.Visible = False
Else
repCorpFilters.DataSource = filters
repCorpFilters.DataBind()
End If
For Each gc As GridColumn In dtgCorp.MasterTableView.Columns
With gc
If .IsBoundToFieldName(strRemoveFilter) Then
.CurrentFilterFunction = GridKnownFunction.NoFilter
.CurrentFilterValue = ""
.AndCurrentFilterFunction = GridKnownFunction.NoFilter
.AndCurrentFilterValue = ""
End If
End With
Next
End If
dtgCorp.DataSource = dvCorp
dtgCorp.DataBind()
End Sub
Все работает отлично, кроме фактического удаления фильтра из RadGrid. Там, где я перебираю столбцы и нахожу правильный столбец с фильтром, который пытаюсь удалить, я сбрасываю выпадающие списки и значения фильтра, это прекрасно работает! Я могу щелкнуть правой кнопкой мыши элемент заголовка, и фильтр показывает не отфильтрованный. Но данные остаются отфильтрованными! Как мне сказать RadGrid переоценить его новое значение фильтра на основе выбранных фильтров?
Сочный фрагмент кода, который я чувствую, находится здесь:
For Each gc As GridColumn In dtgCorp.MasterTableView.Columns
With gc
If .IsBoundToFieldName(strRemoveFilter) Then
.CurrentFilterFunction = GridKnownFunction.NoFilter
.CurrentFilterValue = ""
.AndCurrentFilterFunction = GridKnownFunction.NoFilter
.AndCurrentFilterValue = ""
End If
End With
Next
End If
dtgCorp.DataSource = dvCorp
dtgCorp.DataBind()
2 ответа
For Each gc As GridColumn In dtg.MasterTableView.Columns
With gc
If .IsBoundToFieldName(strRemoveFilter) Then
dtg.MasterTableView.GetItems(GridItemType.FilteringItem)(0).FireCommandEvent(RadGrid.HeaderContextMenuFilterCommandName, _
New Triplet(strRemoveFilter, New Pair("NoFilter", ""), New Pair("NoFilter", "")))
End If
End With
Next
Это код, который, наконец, сделал это:)
Вы пытались использовать привязку NeedDataSource для сетки вместо привязки с помощью вызовов DataBind()? В этом случае просто вызовите метод сетки Rebind(), чтобы очистить значения фильтра. Также посмотрите, как фильтры очищаются в этой демонстрации.
Дик