Hello,
for our website i've built some functionality into our basepage that creates a commandrow with a 'ClearAllFilters' button for every grid.
At first glance this seems to work fine. However, when selecting an item in a grid after a postback (for example filtering, or paging) it is selecting not from the filtered source, but the unfiltered source. So visually the grid is filtered, but when selecting an item it is using the complete list.
Somehow i have the feeling that the adding of a handler for the itemcommand is overwriting certain functionality that is otherwise called during the itemcommand event. However i have not been able to fix the problem, and ive tried tons of things.
Please have a look at the code and let me know if i am doing something wrong here!
Public Class BasePage Inherits Page Private ReadOnly Property AllowedFilterItems As String() = New String() {"Contains", "StartsWith", "EqualTo", "NotEqualTo"} Protected Overrides Sub OnInit(e As EventArgs) For Each grid As RadGrid In Controls.All().OfType(Of RadGrid)() DefineGridStructure(grid) Next MyBase.OnInit(e) End Sub Private Sub DefineGridStructure(grid As RadGrid) AddHandler grid.Load, New EventHandler(AddressOf Grid_OnLoad) AddHandler grid.ItemCommand, New GridCommandEventHandler(AddressOf Grid_OnCommand) AddHandler grid.PreRender, New EventHandler(AddressOf Grid_OnPreRender) AddCommandRow(grid) End Sub Protected Sub BasePage_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load SetupRadgridPaging() End Sub#Region "Radgrid event handlers and helper functions" Public Sub SetupRadgridPaging() For Each grid As RadGrid In Controls.All().OfType(Of RadGrid)() If grid.MasterTableView.DetailTables.Count = 0 AndAlso (grid.AllowPaging OrElse grid.MasterTableView.AllowPaging) Then AddHandler grid.PageSizeChanged, AddressOf Grid_OnPageSizeChanged Dim pageSize = GetPagerSizeForUser(GetGridPagerSettingsKey(grid.ID)) UpdateNewPageSize = False grid.PageSize = pageSize grid.PagerStyle.AlwaysVisible = True grid.AllowPaging = False grid.MasterTableView.PageSize = pageSize grid.MasterTableView.PagerStyle.AlwaysVisible = True grid.MasterTableView.AllowPaging = True UpdateNewPageSize = True End If Next End Sub Private Sub Grid_OnCommand(sender As Object, e As GridCommandEventArgs) Dim grid As RadGrid = CType(sender, RadGrid) If e.CommandName.Equals("ClearAllFilters", StringComparison.InvariantCultureIgnoreCase) Then For Each column As GridColumn In grid.Columns column.CurrentFilterFunction = GridKnownFunction.NoFilter column.CurrentFilterValue = String.Empty Next grid.MasterTableView.FilterExpression = String.Empty grid.Rebind() End If End Sub Private Sub Grid_OnLoad(sender As Object, e As EventArgs) Dim grid As RadGrid = CType(sender, RadGrid) ConfigureFilterMenu(grid) End Sub Private Sub Grid_OnPreRender(sender As Object, e As EventArgs) Dim grid As RadGrid = CType(sender, RadGrid) SetCommandItemVisibility(grid) End Sub Private Sub SetCommandItemVisibility(grid As RadGrid) Dim hasFilter As Boolean = False For Each column As GridColumn In grid.Columns If Not column.CurrentFilterValue = String.Empty Then hasFilter = True Exit For End If Next grid.MasterTableView.CommandItemDisplay = If(hasFilter, GridCommandItemDisplay.Top, GridCommandItemDisplay.None) grid.Rebind() End Sub Private Sub AddCommandRow(grid As RadGrid) grid.MasterTableView.CommandItemTemplate = New GridCommandItemTemplate(CType(LocalizationManager, LocalizationManager)) End Sub Private Sub ConfigureFilterMenu(grid As RadGrid) grid.FilterMenu.Items().ToList().ForEach(Sub(fi) grid.FilterMenu.Items.Remove(fi)) AllowedFilterItems.ForEach(Sub(fi) grid.FilterMenu.Items.Add(New RadMenuItem(fi) With {.Value = fi})) grid.FilterMenu.Localize(App.Session.CurrentCultureIdentifier) End Sub Public Sub Grid_OnPageSizeChanged(sender As Object, e As GridPageSizeChangedEventArgs) Dim grid As RadGrid = CType(sender, RadGrid) UpdateUserSetting(GetGridPagerSettingsKey(grid.ID), e.NewPageSize.ToString()) End Sub Public Function GetGridPagerSettingsKey(grid As String) As String Const prefix As String = "CPGridPager" Dim sPath As String = Request.Url.AbsolutePath Dim oInfo As New FileInfo(sPath) Dim pageName As String = Path.GetFileNameWithoutExtension(oInfo.Name) Return String.Concat(prefix, separator, pageName, separator, grid) End Function#Region "GridCommandItemTemplate" Private Class GridCommandItemTemplate Implements ITemplate Private clearFilter As ImageButton Private _localizationManager As LocalizationManager Public Sub New(ByRef localizationManager As LocalizationManager) MyBase.New _localizationManager = localizationManager End Sub Public Sub InstantiateIn(container As Control) Implements ITemplate.InstantiateIn clearFilter = New ImageButton With { .ID = "clearFilter", .ToolTip = _localizationManager.Localize("Grid_ClearFilters", App.Session.CurrentCultureIdentifier), .CommandName = "ClearAllFilters", .ImageUrl = "/Images/Grid/ClearFilter.png" } container.Controls.Add(clearFilter) End Sub End Class#End Region#End Region