Программное удаление фильтра контекстного меню заголовка из RadGrid - PullRequest
1 голос
/ 13 июля 2010

У меня есть повторитель, который я привязал к именам столбцов, которые фильтруются по мере их применения (в настоящее время, используя сеансы, я мог бы изменить это на цикл по столбцам в поисках фильтров, теперь я действительно знаю, как работает сетка).работает).

У меня есть кнопка рядом с именем каждого отфильтрованного столбца, которая предназначена для удаления фильтра из 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 ]

2 голосов
/ 16 июля 2010
        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

Это код, который, наконец, сделал это:)

1 голос
/ 13 июля 2010

Вы пытались использовать привязку NeedDataSource для сетки вместо привязки с вызовами DataBind ()?В этом случае просто вызовите метод сетки Rebind (), чтобы очистить значения фильтра.Также посмотрите, как очищаются фильтры на этой демонстрации .

Дик

...