This is a migrated thread and some comments may be shown as answers.

Dynamic Grid Creation

1 Answer 122 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Mark
Top achievements
Rank 1
Mark asked on 25 Mar 2011, 05:06 PM
I'm creating a grid dynamically based on filters the user provides. The issue(s) I'm having are:
  1. The column filters no longer work. That is, selecting "Contains" or "StartsWith" doesn't work.
  2. When going to page 2 of the grid, all records are returned (looks like the grid is rebinding and is bringing back every record in the db instead of filters the dataset that's already contained in the grid)

Here's my aspx:
<%@ Page Language="C#" MasterPageFile="~/MasterPages/RADMasterPage.master" AutoEventWireup="true" CodeFile="Report.aspx.cs" Inherits="Reporting_Report" Title="Untitled Page" %>
 
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxtoolkit" %>
<%@ Register src="../Controls/ReportFilters.ascx" tagname="ReportFilters" tagprefix="RF" %>
 
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
 
    <script type="text/javascript">
        function requestStart(sender, args) {
            if (args.get_eventTarget().indexOf("ExportToExcelButton") >= 0) {
                args.set_enableAjax(false);
            }
        }
    </script>
</asp:Content>
<asp:Content ID="SectionHeader" ContentPlaceHolderID="cphSectionHeader" runat="server">
    <h3>Reporting</h3>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    <div>       
        <telerik:RadPanelBar ID="rpbFilters" Runat="server" Skin="Office2007"
            Width="100%" onitemclick="rpbFilters_ItemClick">
            <CollapseAnimation Type="Linear" Duration="200" />
            <ExpandAnimation Type="Linear" Duration="200" />
            <Items>
                <telerik:RadPanelItem Text="Report Filters" Expanded="true">
                    <Items>
                        <telerik:RadPanelItem Value="filters" runat="server">
                            <ItemTemplate>
                                <div>
                                    <RF:ReportFilters ID="rfFilters" runat="server" />
                                    <asp:Button ID="btnRunReport" runat="server" Text="Run Report" OnClick="RunReport" />
                                </div>
                            </ItemTemplate>
                        </telerik:RadPanelItem>
                    </Items>                   
                </telerik:RadPanelItem>
            </Items>
        </telerik:RadPanelBar>       
    </div>
    <asp:Panel ID="pnlGrid" runat="server" Visible="false">   
    <div id="wrapper">
        <telerik:radajaxmanager id="ramReport" runat="server">
            <AjaxSettings>
                <telerik:AjaxSetting AjaxControlID="rgReport">
                    <UpdatedControls>
                        <telerik:AjaxUpdatedControl ControlID="rgReport" LoadingPanelID="ralpReport" />
                    </UpdatedControls>
                </telerik:AjaxSetting>
            </AjaxSettings>
        </telerik:radajaxmanager>
        <telerik:radajaxloadingpanel
            enabled="true"
            id="ralpReport"           
            issticky="false"
            runat="server"
            skin=""
            transparency="50">
            <img id="imgLoader" src="../Images/loading3.gif" alt="Loading..." />
        </telerik:radajaxloadingpanel>
        <telerik:radajaxpanel
            clientevents-onrequeststart="requestStart"
            id="rapReport"
            loadingpanelid="ralpReport"
            runat="server">
             
            <telerik:RadGrid
                AllowFilteringByColumn="False"
                AllowPaging="True"
                AllowSorting="True"
                AutoGenerateColumns="False"
                DataSourceID="odsReports"
                EnableViewState="false"
                GridLines="None"
                ID="rgReport"
                OnExcelMLExportRowCreated="RadGrid1_ExcelMLExportRowCreated"
                OnExcelMLExportStylesCreated="RadGrid1_ExcelMLExportStylesCreated"
                runat="server"
                ShowFooter="True"
                ShowGroupPanel="True">
                 
                <ClientSettings
                    AllowColumnsReorder="true"
                    AllowDragToGroup="true"
                    ReorderColumnsOnClient="true">
                    <Scrolling AllowScroll="True" UseStaticHeaders="True" SaveScrollPosition="True" />
                </ClientSettings>
                 
                <ExportSettings
                    ExportOnlyData="true"
                    IgnorePaging="true"
                    OpenInNewWindow="true">
                    <Excel Format="ExcelML" />
                </ExportSettings>
                 
                <FilterMenu
                    EnableImageSprites="False" />
                 
                <GroupingSettings
                    CaseSensitive="false"
                    ShowUnGroupButton="true" />
                 
                <HeaderContextMenu
                    CssClass="GridContextMenu GridContextMenu_Default" />               
                 
                <PagerStyle
                    Mode="NextPrevNumericAndAdvanced" />
            </telerik:RadGrid>
        </telerik:radajaxpanel>
    </div>
    <asp:ObjectDataSource ID="odsReports" runat="server"
            SelectMethod="GetReportResults"
            TypeName="Budco.StoreFront.Reporting.BLL.ReportResultset" OnObjectCreating="ObjectCreating">
    </asp:ObjectDataSource>
    </asp:Panel>
</asp:Content>

And here is my code behind:

using System;
using System.Data;
using System.Web.UI;
using Telerik.Web.UI;
using Budco.StoreFront.Reporting;
using Budco.StoreFront.Reporting.BLL;
using Budco.StoreFront.Common;
using Telerik.Web.UI.GridExcelBuilder;
using System.Web.UI.WebControls;
 
 
 
public partial class Reporting_Report : System.Web.UI.Page
{
    bool isConfigured = false;
    int filterDelay;
    int? _ReportID = null;
    string _ReportName = null;
    ReportResultset _ReportResultset = null;
    int? _ReportResultsID = null;
     
 
    protected void Page_Load(object sender, EventArgs e)
    {
        object oReportID = Request["ReportID"];
        object oReportName = Request["ReportName"];
        object oReportResultsID = Request["ReportResultsID"];
 
        if (oReportID != null)
        {
            _ReportID = Convert.ToInt32(oReportID);
            _ReportResultset = new ReportResultset((int)_ReportID);
        }
        if (_ReportID == null && oReportName != null)
        {
            _ReportName = oReportName.ToString();
            _ReportResultset = new ReportResultset(_ReportName);
        }
 
        if (oReportResultsID != null)
        {
            _ReportResultsID = Convert.ToInt32(oReportResultsID);
        }
 
 
        //if (!Page.IsPostBack)
        //{
            if (_ReportID != null || _ReportName != null)
            {
                GetParameterAttributes paramAttributes = new GetParameterAttributes();
                Reporting.GetParameterAttributesDataTable paramAttributesDT = paramAttributes.GetData(_ReportID);
                ASP.controls_reportfilters_ascx ctrl = (ASP.controls_reportfilters_ascx)rpbFilters.FindItemByValue("filters").FindControl("rfFilters");
                ctrl.BindControls(paramAttributesDT);
            }
        //}
        if (_ReportID != null || _ReportName != null)
        {
            //this.btnRunReport.Enabled = false;
        }
    }
 
 
    protected void RadGrid1_ExcelMLExportRowCreated(object source, GridExportExcelMLRowCreatedArgs e)
    {
        if (e.RowType == GridExportExcelMLRowType.DataRow)
        {
            //CellElement cell = e.Row.Cells.GetCellByName("Price");
            //cell.StyleValue = cell.StyleValue == "itemStyle" ? "priceItemStyle" : "alternatingPriceItemStyle";
        }
 
        if (e.RowType == Telerik.Web.UI.GridExcelBuilder.GridExportExcelMLRowType.HeaderRow)
        {
            e.Worksheet.WorksheetOptions.PageSetup.PageHeaderElement.Data = "This is the header";
            e.Worksheet.WorksheetOptions.PageSetup.PageHeaderElement.Margin = 0.25;
            e.Worksheet.WorksheetOptions.PageSetup.PageFooterElement.Data = "This is the footer";
            e.Worksheet.WorksheetOptions.PageSetup.PageFooterElement.Margin = 0.25;
        }
 
        if (!isConfigured)
        {
            e.Worksheet.Name = "Test Agent Report";
 
            PageSetupElement pageSetup = e.Worksheet.WorksheetOptions.PageSetup;
            pageSetup.PageLayoutElement.IsCenteredVertical = true;
            pageSetup.PageLayoutElement.IsCenteredHorizontal = true;
            pageSetup.PageMarginsElement.Left = 0.75;
            pageSetup.PageMarginsElement.Top = 0.5;
            pageSetup.PageMarginsElement.Right = 0.5;
            pageSetup.PageMarginsElement.Bottom = 0.75;
            pageSetup.PageLayoutElement.PageOrientation = PageOrientationType.Landscape;
 
            e.Worksheet.WorksheetOptions.AllowFreezePanes = true;
            e.Worksheet.WorksheetOptions.LeftColumnRightPaneNumber = 1;
            e.Worksheet.WorksheetOptions.TopRowBottomPaneNumber = 1;
            e.Worksheet.WorksheetOptions.SplitHorizontalOffset = 1;
            e.Worksheet.WorksheetOptions.SplitVerticalOffest = 1;
 
            e.Worksheet.WorksheetOptions.ActivePane = 2;
            isConfigured = true;
        }
    }
 
 
    protected void RadGrid1_ExcelMLExportStylesCreated(object source, GridExportExcelMLStyleCreatedArgs e)
    {
        StyleElement priceStyle = new StyleElement("priceItemStyle");
        priceStyle.NumberFormat.FormatType = NumberFormatType.Currency;
        priceStyle.FontStyle.Color = System.Drawing.Color.Red;
        e.Styles.Add(priceStyle);
 
        StyleElement alternatingPriceStyle = new StyleElement("alternatingPriceItemStyle");
        alternatingPriceStyle.NumberFormat.FormatType = NumberFormatType.Currency;
        alternatingPriceStyle.FontStyle.Color = System.Drawing.Color.Red;
        e.Styles.Add(alternatingPriceStyle);
 
        foreach (StyleElement style in e.Styles)
        {
            switch (style.Id)
            {
                case "itemStyle": style.FontStyle.Color = System.Drawing.Color.Green; break;
            }
        }
    }
 
    protected void RunReport(object sender, EventArgs e)
    {
        if (_ReportID != null || _ReportName != null)
        {
            ASP.controls_reportfilters_ascx ctrl = (ASP.controls_reportfilters_ascx)rpbFilters.FindItemByValue("filters").FindControl("rfFilters");
            Panel pnl = (Panel)ctrl.FindControl("pnlFilters");
            if (pnl.HasControls())
            {
                //GetParameterAttributes paramAttributes = new GetParameterAttributes();
                //Reporting.GetParameterAttributesDataTable paramAttributesDT = paramAttributes.GetData(_ReportID);
                _ReportResultset.ParameterValues.Clear();
                 
                foreach (Control control in pnl.Controls)
                {
                    string theControl = control.GetType().ToString();
                    switch (control.GetType().ToString())
                    {
                        case "System.Web.UI.WebControls.TextBox":
                            _ReportResultset.ParameterValues.Add(new Budco.StoreFront.Common.Parameter(control.ID.Substring(3), ((TextBox)control).Text));
                            break;
                    }
                }
            }
 
            // Get ReportResults & ReportResultsColumn data
            ReportResults rptResults = new ReportResults();
            //ReportResultsColumn rptResultsColumn = new ReportResultsColumn();
            GetReportResultsColumns rptResultsColumn = new GetReportResultsColumns();
            Reporting.ReportResultsDataTable resultsDT = rptResults.GetData(this._ReportResultsID, _ReportID);
            Reporting.GetReportResultsColumnsDataTable resultsColumnDT = rptResultsColumn.GetData(null, resultsDT.Rows[0]["ResultsName"].ToString());
 
            // Set RadGrid level properties
            rgReport.Skin = "Office2007"; //resultsDT.Rows[0]["Skin"].ToString();
            rgReport.HeaderStyle.CssClass = resultsDT.Rows[0]["HeaderStyleCssClass"].ToString();
            rgReport.ItemStyle.CssClass = resultsDT.Rows[0]["ItemStyleCssClass"].ToString();
            rgReport.FooterStyle.CssClass = resultsDT.Rows[0]["FooterStyleCssClass"].ToString();
 
            // Set MasterTableView level properties
            rgReport.MasterTableView.CommandItemSettings.ShowExportToCsvButton = (bool)resultsDT.Rows[0]["ShowExportToCsvButton"];
            rgReport.MasterTableView.CommandItemSettings.ShowExportToExcelButton = (bool)resultsDT.Rows[0]["ShowExportToExcelButton"];
            rgReport.MasterTableView.CommandItemSettings.ShowAddNewRecordButton = false;
            rgReport.MasterTableView.AllowFilteringByColumn = true;
            rgReport.MasterTableView.AutoGenerateColumns = false;
            rgReport.MasterTableView.CommandItemDisplay = GridCommandItemDisplay.TopAndBottom;
            rgReport.MasterTableView.ShowFooter = true;
            rgReport.MasterTableView.TableLayout = GridTableLayout.Auto;
            this.rgReport.MasterTableView.Columns.Clear(); // this prevents duplicate columns which causes an error
 
            foreach (DataRow row in resultsColumnDT.Rows)
            {
                switch (row["ColumnTypeName"].ToString())
                {
                    case "Telerik.Web.UI.GridBoundColumn":
                        GridBoundColumn boundColumn = new GridBoundColumn();
                        this.rgReport.MasterTableView.Columns.Add(boundColumn);
 
                        boundColumn.AllowFiltering = (bool)row["AllowFiltering"];
                        boundColumn.AllowSorting = (bool)row["AllowSorting"];
                        boundColumn.AutoPostBackOnFilter = (bool)row["AutoPostBackOnFilter"];
                        boundColumn.DataField = row["DataField"].ToString();
                        boundColumn.DataFormatString = row["DataFormatString"].ToString();
                        boundColumn.FilterControlAltText = row["FilterControlAltText"].ToString();
                        bool result = Int32.TryParse(row["FilterDelay"].ToString(), out filterDelay);
                        boundColumn.FilterDelay = filterDelay;
                        boundColumn.HeaderText = row["HeaderText"].ToString();
                        boundColumn.SortExpression = row["DataField"].ToString();
                        boundColumn.UniqueName = row["DataField"].ToString();
                        break;
 
                    case "Telerik.Web.UI.GridDateTimeColumn":
                        GridDateTimeColumn dateTimeColumn = new GridDateTimeColumn();
                        this.rgReport.MasterTableView.Columns.Add(dateTimeColumn);
 
                        dateTimeColumn.AllowFiltering = (bool)row["AllowFiltering"];
                        dateTimeColumn.AllowSorting = (bool)row["AllowSorting"];
                        dateTimeColumn.AutoPostBackOnFilter = (bool)row["AutoPostBackOnFilter"];
                        dateTimeColumn.DataField = row["DataField"].ToString();
                        dateTimeColumn.DataFormatString = row["DataFormatString"].ToString();
                        dateTimeColumn.DataType = System.Type.GetType(row["DataType"].ToString());
                        dateTimeColumn.FilterControlAltText = row["FilterControlAltText"].ToString();
                        bool result2 = Int32.TryParse(row["FilterDelay"].ToString(), out filterDelay);
                        dateTimeColumn.FilterDelay = filterDelay;
                        dateTimeColumn.HeaderText = row["HeaderText"].ToString();
                        dateTimeColumn.PickerType = GridDateTimeColumnPickerType.DatePicker;
                        dateTimeColumn.SortExpression = row["DataField"].ToString();
                        dateTimeColumn.UniqueName = row["DataField"].ToString();
                        break;
 
                    case "Telerik.Web.UI.GridNumericColumn":
                        GridNumericColumn numericColumn = new GridNumericColumn();
                        this.rgReport.MasterTableView.Columns.Add(numericColumn);
 
                        foreach (GridAggregateFunction gaf in Enum.GetValues(typeof(GridAggregateFunction)))
                        {
                            if (gaf.ToString().Equals(row["Aggregate"].ToString()))
                            {
                                numericColumn.Aggregate = gaf;
                                break;
                            }
                        }
                        numericColumn.AllowFiltering = (bool)row["AllowFiltering"];
                        numericColumn.AllowSorting = (bool)row["AllowSorting"];
                        numericColumn.AutoPostBackOnFilter = (bool)row["AutoPostBackOnFilter"];
                        numericColumn.DataField = row["DataField"].ToString();
                        numericColumn.DataFormatString = row["DataFormatString"].ToString();
                        numericColumn.DataType = System.Type.GetType(row["DataType"].ToString());
                        numericColumn.FilterControlAltText = row["FilterControlAltText"].ToString();
                        bool result3 = Int32.TryParse(row["FilterDelay"].ToString(), out filterDelay);
                        numericColumn.FilterDelay = filterDelay;
                        numericColumn.FooterAggregateFormatString = row["FooterAggregateFormatString"].ToString();
                        numericColumn.HeaderText = row["HeaderText"].ToString();
                        numericColumn.SortExpression = row["DataField"].ToString();
                        numericColumn.UniqueName = row["DataField"].ToString();
                        break;
 
                    default:
                        break;
                }
 
            }
 
            rgReport.Rebind(); // this causes the grid to bring back every record from the db.
            pnlGrid.Visible = true;
        }
    }
    protected void rpbFilters_ItemClick(object sender, RadPanelBarEventArgs e)
    {
         
    }
 
 
    protected void ObjectCreating(object sender, ObjectDataSourceEventArgs e)
    {
        if (_ReportID != null || _ReportName != null)
        {
            //_ReportResultset = new ReportResultset((int)_ReportID);
            e.ObjectInstance = _ReportResultset;
        }
    }
}


What am I doing wrong here?

Thanks,
Mark

1 Answer, 1 is accepted

Sort by
0
Mira
Telerik team
answered on 31 Mar 2011, 08:25 AM
Hello Mark,

In order to change the grid structure dynamically, you must:
  1. ensure that the entire grid, including its columns collection, is modified on Page_Init so that the control ViewState remains consistent
  2. set the EnableColumnViewState property to False, so that the grid knows that the columns may vary at some stage of the page lifecycle.
Otherwise, built-in features such as sorting, paging, and so on will not function as expected.
Please refer to the Changing the grid structure dynamically on postback help topic for additional information.

I hope this helps.

Best wishes,
Mira
the Telerik team
Tags
Grid
Asked by
Mark
Top achievements
Rank 1
Answers by
Mira
Telerik team
Share this question
or