I have implemented a solution for a project that utilizes a RadGrid, custom filter controls, custom filtering, custom sorting, and custom paging. I am using LINQ2SQL for my datasource, and using the NeedDataSource event. Everything is working perfectly, except for when I try to filter a column using
The pager is showing the correct number of records, as I am setting that using the VirtualItemCount property of the radgrid, but when the page loads, it is giving me the "No records to display" message inside the grid.
Below is the .aspx page, the .aspx.cs code behind, and the code for the custom filter control. I have been struggling for a while to figure this out, but can't for the life of me figure out why it wouldn't be working.
HELP ME PLEASE!!!
ltcs = ltcs.Where(l => Object.Equals(l.status, null));Below is the .aspx page, the .aspx.cs code behind, and the code for the custom filter control. I have been struggling for a while to figure this out, but can't for the life of me figure out why it wouldn't be working.
HELP ME PLEASE!!!
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="ListToCountList.aspx.cs" Inherits="ListToCountList" %><%@ Register TagPrefix="rad" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %><%@ Register TagPrefix="HU" Namespace="HumanUse.CustomControls" %><asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="Server"> <style type="text/css"> .wait, .wait * { cursor: wait !important; } </style></asp:Content><asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <rad:RadAjaxManager ID="RadAjaxManager1" runat="server" OnAjaxRequest="RadAjaxManager1_AjaxRequest" DefaultLoadingPanelID="RadAjaxLoadingPanel1"> <AjaxSettings> <rad:AjaxSetting AjaxControlID="RadAjaxManager1"> <UpdatedControls> <rad:AjaxUpdatedControl ControlID="RadGrid1" /> </UpdatedControls> </rad:AjaxSetting> <rad:AjaxSetting AjaxControlID="RadGrid1"> <UpdatedControls> <rad:AjaxUpdatedControl ControlID="RadGrid1" LoadingPanelID="RadAjaxLoadingPanel1" /> </UpdatedControls> </rad:AjaxSetting> </AjaxSettings> </rad:RadAjaxManager> <rad:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server" Height="430px" Width="924px" Transparency="0"> <img alt="Loading..." src='<%= RadAjaxLoadingPanel.GetWebResourceUrl(Page, "Telerik.Web.UI.Skins.Default.Ajax.loading.gif") %>' style="border: 0;" /> </rad:RadAjaxLoadingPanel> <rad:RadCodeBlock ID="RadCodeBlock1" runat="server"> <script type="text/javascript"> function ShowViewForm(id, rowIndex) { var grid = $find("<%= RadGrid1.ClientID %>"); var rowControl = grid.get_masterTableView().get_dataItems()[rowIndex].get_element(); grid.get_masterTableView().selectItem(rowControl, true); var manager = GetRadWindowManager(); var window1 = manager.getWindowByName("ListToCountForm"); window1.setUrl("ListToCountForm.aspx?ltcid=" + id); window1.show(); return false; } function refreshGrid(arg, rebindOnly) { alert('Your changes have been saved successfully'); if (!arg && !rebindOnly) { $find("<%= RadAjaxManager1.ClientID %>").ajaxRequest("Rebind"); } else if (rebindOnly) { $find("<%= RadAjaxManager1.ClientID %>").ajaxRequest("RebindOnly"); } else { $find("<%= RadAjaxManager1.ClientID %>").ajaxRequest("RebindOnly"); } } </script> </rad:RadCodeBlock> <rad:RadGrid ID="RadGrid1" runat="server" PageSize="25" GridLines="None" AllowCustomPaging="true" AllowFilteringByColumn="True" AllowPaging="True" AllowSorting="True" EnableLinqExpressions="false" AutoGenerateColumns="False"> <MasterTableView ClientDataKeyNames="assignment_id" AllowCustomPaging="true" AllowMultiColumnSorting="true" AllowCustomSorting="true" DataKeyNames="assignment_id" AutoGenerateColumns="False" AllowFilteringByColumn="True"> <Columns> <rad:GridBoundColumn HeaderText="Segment" AllowFiltering="true" AllowSorting="true" DataField="segment_id" UniqueName="segment_id" DataType="System.Int32" SortExpression="segment_id" CurrentFilterFunction="EqualTo" ShowFilterIcon="false"> </rad:GridBoundColumn> <rad:GridBoundColumn HeaderText="Photo Date" DataField="photo_date" DataType="System.DateTime" DataFormatString="{0:d}" SortExpression="photo_date" UniqueName="date" CurrentFilterFunction="EqualTo" ShowFilterIcon="false"> </rad:GridBoundColumn> <HU:DistinctLTCValueDropDownFilterColumn FilterControlWidth="60" HeaderText="Initials" AllowFiltering="true" DataField="initials" UniqueName="initials" SortExpression="initials" ShowFilterIcon="false"> <ItemTemplate> <%#Eval("initials") %> </ItemTemplate> </HU:DistinctLTCValueDropDownFilterColumn> <HU:DistinctLTCValueDropDownFilterColumn FilterControlWidth="60" HeaderText="Zone" AllowFiltering="true" DataField="zone" UniqueName="zone" SortExpression="zone" ShowFilterIcon="false"> <ItemTemplate> <%#Eval("zone")%> </ItemTemplate> </HU:DistinctLTCValueDropDownFilterColumn> <HU:DistinctLTCValueDropDownFilterColumn FilterControlWidth="140" HeaderText="Field Office" AllowFiltering="true" DataField="FieldOffice" UniqueName="FieldOffice" SortExpression="FieldOffice" ShowFilterIcon="false"> <ItemTemplate> <%#Eval("FieldOffice")%> </ItemTemplate> </HU:DistinctLTCValueDropDownFilterColumn> <HU:DistinctLTCValueDropDownFilterColumn FilterControlWidth="100" HeaderText="Status" AllowFiltering="true" DataField="status" UniqueName="status" SortExpression="status" ShowFilterIcon="false"> <ItemTemplate> <%#Eval("status")%> </ItemTemplate> </HU:DistinctLTCValueDropDownFilterColumn> <rad:GridBoundColumn HeaderText="Last User" DataField="last_updated_user" ItemStyle-VerticalAlign="Top" DataType="System.String" SortExpression="last_updated_user" AllowFiltering="true" AllowSorting="true" CurrentFilterFunction="EqualTo" ShowFilterIcon="false"> </rad:GridBoundColumn> <rad:GridBoundColumn HeaderText="Last Update" DataField="last_update_date" ItemStyle-VerticalAlign="Top" DataFormatString="{0:MM/dd/yyyy}" UniqueName="last_update_date" SortExpression="last_update_date" AllowSorting="true" CurrentFilterFunction="EqualTo" ShowFilterIcon="false"> </rad:GridBoundColumn> <HU:DistinctLTCValueDropDownFilterColumn FilterControlWidth="50" HeaderText="Boating" AllowFiltering="true" DataField="boating" UniqueName="boating" SortExpression="boating" ShowFilterIcon="false"> <ItemTemplate> <%#Eval("boating")%> </ItemTemplate> </HU:DistinctLTCValueDropDownFilterColumn> <rad:GridTemplateColumn ItemStyle-VerticalAlign="Top" UniqueName="TemplateEditColumn" AllowFiltering="True" HeaderText="Edit" HeaderStyle-Wrap="false"> <ItemTemplate> <asp:HyperLink ID="EditLink" runat="server" Text="Edit"></asp:HyperLink> </ItemTemplate> <FilterTemplate> <asp:Button runat="server" ID="btnFilter" Text="Filter" OnClick="btn_Click" /> <br /> <asp:Button runat="server" ID="btnClearFilter" Text="Clear" OnClick="btn_ClearClick" /> </FilterTemplate> </rad:GridTemplateColumn> </Columns> </MasterTableView> </rad:RadGrid> <rad:RadWindowManager ID="RadWindowManager1" runat="server" Skin="Vista"> <Windows> <rad:RadWindow Skin="Vista" ID="ListToCountForm" ClientIDMode="Static" RestrictionZoneID="main" ShowContentDuringLoad="false" runat="server" Title="List To Count Form" Width="400px" Height="600px" ReloadOnShow="true" Modal="true" /> </Windows> </rad:RadWindowManager></asp:Content>using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using Telerik.Web.UI;using HumanUse;using System.Configuration;using System.Text.RegularExpressions;public partial class ListToCountList : BasePage{ protected void Page_Load(object sender, EventArgs e) { base.CheckSecurity(true); RadGrid1.GroupingSettings.CaseSensitive = false; RadGrid1.ItemDataBound += new Telerik.Web.UI.GridItemEventHandler(RadGrid1_ItemDataBound); RadGrid1.NeedDataSource += new GridNeedDataSourceEventHandler(RadGrid1_NeedDataSource); } protected void btn_Click(object sender, EventArgs e) { RadGrid1.Rebind(); } protected void btn_ClearClick(object sender, EventArgs e) { RadGrid1.MasterTableView.FilterExpression = ""; foreach (GridColumn c in RadGrid1.MasterTableView.Columns) { c.CurrentFilterValue = ""; } RadGrid1.Rebind(); } void RadGrid1_NeedDataSource(object source, GridNeedDataSourceEventArgs e) { WCSAerialDataContext db = new WCSAerialDataContext(ConfigurationManager.ConnectionStrings["WCS_AerialConnectionString"].ConnectionString); IQueryable<vwLTC> ltcs = db.vwLTCs; if (ShouldApplySortFilterOrGroup()) { if (RadGrid1.MasterTableView.FilterExpression != "") { foreach (String s in RadGrid1.MasterTableView.FilterExpression.Replace("AND", "~").Split('~')) { string column = s.Substring(2, s.IndexOf("]", 2) - 2); string value = ""; if (column != "segment_id") { value = RadGrid1.MasterTableView.FilterExpression.Substring(RadGrid1.MasterTableView.FilterExpression.IndexOf("'") + 1, RadGrid1.MasterTableView.FilterExpression.IndexOf("'", RadGrid1.MasterTableView.FilterExpression.IndexOf("'") + 1) - (RadGrid1.MasterTableView.FilterExpression.IndexOf("'") + 1)); } else { value = RadGrid1.MasterTableView.FilterExpression.Substring(RadGrid1.MasterTableView.FilterExpression.IndexOf("=") + 2, (RadGrid1.MasterTableView.FilterExpression.IndexOf(")", RadGrid1.MasterTableView.FilterExpression.IndexOf("=") + 2) - (RadGrid1.MasterTableView.FilterExpression.IndexOf("=") + 2))); } if (value == "NULL") value = null; switch (column) { case "segment_id": ltcs = ltcs.Where(l => l.segment_id == int.Parse(value)); break; case "photo_date": ltcs = ltcs.Where(l => l.photo_date == DateTime.Parse(value)); break; case "initials": if (value == null) { ltcs = ltcs.Where(l => Object.Equals(l.initials, null)); } else { value = value.Replace("%", ""); ltcs = ltcs.Where(l => l.initials == value); } break; case "zone": if (value == null) { ltcs = ltcs.Where(l => Object.Equals(l.zone, null)); } else { value = value.Replace("%", ""); ltcs = ltcs.Where(l => l.zone == value); } break; case "FieldOffice": if (value == null) { ltcs = ltcs.Where(l => Object.Equals(l.FieldOffice, null)); } else { value = value.Replace("%", ""); ltcs = ltcs.Where(l => l.FieldOffice == value); } break; case "status": if (value == null) { ltcs = ltcs.Where(l => Object.Equals(l.status, null)); } else { value = value.Replace("%", ""); ltcs = ltcs.Where(l => l.status == value); } break; case "last_updated_user": if (value == null) { ltcs = ltcs.Where(l => Object.Equals(l.last_updated_user, null)); } else { value = value.Replace("%", ""); ltcs = ltcs.Where(l => l.last_updated_user == value); } break; case "last_update_date": ltcs = ltcs.Where(l => l.last_update_date == DateTime.Parse(value)); break; case "boating": if (value == null) { ltcs = ltcs.Where(l => Object.Equals(l.boating, null)); } else { value = value.Replace("%", ""); ltcs = ltcs.Where(l => l.boating == value); } break; } } } if (RadGrid1.MasterTableView.SortExpressions.Count > 0) { foreach (GridSortExpression exp in RadGrid1.MasterTableView.SortExpressions) { switch (exp.FieldName) { case "segment_id": if (exp.SortOrder == GridSortOrder.Ascending) ltcs = ltcs.OrderBy(l => l.segment_id); else if (exp.SortOrder == GridSortOrder.Descending) ltcs = ltcs.OrderByDescending(l => l.segment_id); break; case "photo_date": if (exp.SortOrder == GridSortOrder.Ascending) ltcs = ltcs.OrderBy(l => l.photo_date); else if (exp.SortOrder == GridSortOrder.Descending) ltcs = ltcs.OrderByDescending(l => l.photo_date); break; case "initials": if (exp.SortOrder == GridSortOrder.Ascending) ltcs = ltcs.OrderBy(l => l.initials); else if (exp.SortOrder == GridSortOrder.Descending) ltcs = ltcs.OrderByDescending(l => l.initials); break; case "zone": if (exp.SortOrder == GridSortOrder.Ascending) ltcs = ltcs.OrderBy(l => l.zone); else if (exp.SortOrder == GridSortOrder.Descending) ltcs = ltcs.OrderByDescending(l => l.zone); break; case "FieldOffice": if (exp.SortOrder == GridSortOrder.Ascending) ltcs = ltcs.OrderBy(l => l.FieldOffice); else if (exp.SortOrder == GridSortOrder.Descending) ltcs = ltcs.OrderByDescending(l => l.FieldOffice); break; case "status": if (exp.SortOrder == GridSortOrder.Ascending) ltcs = ltcs.OrderBy(l => l.status); else if (exp.SortOrder == GridSortOrder.Descending) ltcs = ltcs.OrderByDescending(l => l.status); break; case "last_updated_user": if (exp.SortOrder == GridSortOrder.Ascending) ltcs = ltcs.OrderBy(l => l.last_updated_user); else if (exp.SortOrder == GridSortOrder.Descending) ltcs = ltcs.OrderByDescending(l => l.last_updated_user); break; case "last_update_date": if (exp.SortOrder == GridSortOrder.Ascending) ltcs = ltcs.OrderBy(l => l.last_update_date); else if (exp.SortOrder == GridSortOrder.Descending) ltcs = ltcs.OrderByDescending(l => l.last_update_date); break; case "boating": if (exp.SortOrder == GridSortOrder.Ascending) ltcs = ltcs.OrderBy(l => l.boating); else if (exp.SortOrder == GridSortOrder.Descending) ltcs = ltcs.OrderByDescending(l => l.boating); break; } } } } RadGrid1.VirtualItemCount = ltcs.Count(); RadGrid1.DataSource = ltcs.Skip(RadGrid1.CurrentPageIndex * RadGrid1.PageSize).Take(RadGrid1.PageSize); } public bool ShouldApplySortFilterOrGroup() { return RadGrid1.MasterTableView.FilterExpression != "" || RadGrid1.MasterTableView.SortExpressions.Count > 0; } void RadGrid1_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e) { if (e.Item is GridDataItem) { string next = string.Empty; string previous = string.Empty; string current = string.Empty; current = e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["assignment_id"].ToString(); HyperLink editLink = (HyperLink)e.Item.FindControl("EditLink"); editLink.Attributes["href"] = "#"; editLink.Attributes["onclick"] = String.Format("return ShowViewForm('{0}','{1}');", current, e.Item.ItemIndex); } } protected void RadAjaxManager1_AjaxRequest(object sender, AjaxRequestEventArgs e) { if (e.Argument == "Rebind") { RadGrid1.MasterTableView.SortExpressions.Clear(); RadGrid1.MasterTableView.GroupByExpressions.Clear(); RadGrid1.Rebind(); } else if (e.Argument == "RebindAndNavigate") { RadGrid1.MasterTableView.SortExpressions.Clear(); RadGrid1.MasterTableView.GroupByExpressions.Clear(); RadGrid1.MasterTableView.CurrentPageIndex = RadGrid1.MasterTableView.PageCount - 1; RadGrid1.Rebind(); } else if (e.Argument == "RebindOnly") { RadGrid1.Rebind(); } }}using Telerik.Web.UI;using System.Data;using System.Web.UI;using System.Web.UI.WebControls;using System.Data.SqlClient;using System.Configuration;using System.Collections.Generic;using System;namespace HumanUse.CustomControls{ /// <summary> /// Summary description for DistinctValueDropDownFilterColumn /// </summary> public class DistinctLTCValueDropDownFilterColumn : GridTemplateColumn { public enum Orders { ASC, DESC } public Orders Order { get; set; } public bool OrderResults { get; set; } protected override void SetupFilterControls(TableCell cell) { RadComboBox rcBox = new RadComboBox(); rcBox.ID = "DDL" + this.UniqueName; rcBox.AutoPostBack = this.AutoPostBackOnFilter; rcBox.Width = this.FilterControlWidth; rcBox.SelectedIndexChanged += rcBox_SelectedIndexChanged; WCSAerialDataContext db = new WCSAerialDataContext(); string q = String.Format("SELECT DISTINCT {0} FROM vwLTC", DataField); if(OrderResults) { q += " ORDER BY " + DataField + " " + Order.ToString(); } IEnumerable<String> values = db.ExecuteQuery<String>(q); rcBox.Items.Add(new RadComboBoxItem("No Filter", "")); foreach (string s in values) { if(String.IsNullOrWhiteSpace(s)) rcBox.Items.Add(new RadComboBoxItem("", "NULL")); else rcBox.Items.Add(new RadComboBoxItem(s, s)); } cell.Controls.Add(rcBox); } protected override void SetCurrentFilterValueToControl(TableCell cell) { if (!(this.CurrentFilterValue == "")) { ((RadComboBox)cell.Controls[0]).Items.FindItemByValue(this.CurrentFilterValue).Selected = true; } } protected override string GetCurrentFilterValueFromControl(TableCell cell) { string currentText = ((RadComboBox)cell.Controls[0]).SelectedItem.Text; string currentValue = ((RadComboBox)cell.Controls[0]).SelectedItem.Value; this.CurrentFilterFunction = (currentText != "No Filter") ? GridKnownFunction.EqualTo : GridKnownFunction.NoFilter; return currentValue; } private void rcBox_SelectedIndexChanged(object sender, RadComboBoxSelectedIndexChangedEventArgs e) { ((GridFilteringItem)(((RadComboBox)sender).Parent.Parent)).FireCommandEvent("Filter", new Pair()); } }}