RadDataPager always uses zero StartRowIndex

3 posts, 0 answers
  1. Douglas
    Douglas avatar
    1 posts
    Member since:
    Aug 2010

    Posted 04 Aug 2010 Link to this post

    I am trying to implement pageable charts by implementing the IRadPageableItemContainer in a class extending MS' System.Web.DataVisualization chart components.

    When I add a RadDataPager to the page, and associate it with the chart control, the RadDataPager always sets the StartRowIndex (in SetPageProperties) to zero.  It never advances the position (with any of the buttons or fields), or allows me to select a different number of results per page.

    Using Win XP SP3, FireFox 3.6 and IE 7/8, VS2008/.Net 3.5, with the RadControls for ASP.NET Ajax Q1 2010.

    Here's my markup:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DougRadDataPagerTest1.aspx.cs" Inherits="KMI.IntelliDrive.Appl.Web.UI.test.DougRadDataPagerTest1" %>
    <%@ Register Assembly="IntelliDriveChartControls" Namespace="IntelliDrive.Charting" TagPrefix="cc1" %>
    <%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <head runat="server">
        <form id="form1" runat="server">
        <telerik:RadScriptManager runat="server"></telerik:RadScriptManager>
            <asp:Button ID="Button1" runat="server" Text="Clear Data"
            onclick="Button1_Click" />
                <telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" EnableAJAX="true" >
                    <cc1:PageableChart ID="newChart" runat="server" ImageStorageMode="UseHttpHandler" PagingEnabled="true" EnableViewState="True">
                                <asp:Title Text="Title"></asp:Title>
                                <asp:ChartArea Name="ChartArea1">
                                    <AxisY >
                                        <LabelStyle Format="{$#,##0;($#,##0)}" />
                    <telerik:RadDataPager ID="RadDataPager1" runat="server" PagedControlID="newChart" Enabled="true" BorderStyle="Ridge"  Visible="true">
                            <telerik:RadDataPagerButtonField  FieldType="FirstPrev" />
                            <telerik:RadDataPagerButtonField FieldType="Numeric" />
                            <telerik:RadDataPagerButtonField FieldType="NextLast" />
                            <telerik:RadDataPagerPageSizeField PageSizeText="Page size: " />
                            <telerik:RadDataPagerGoToPageField CurrentPageText="Page: " TotalPageText="of" SubmitButtonText="Go" TextBoxWidth="15" />
                                   <div >
                                           <asp:Label runat="server" ID="Label1" Text="<%# Container.Owner.StartRowIndex+1%>" />
                                           <asp:Label runat="server" ID="Label2" Text="<%# Container.Owner.StartRowIndex+Container.Owner.PageSize %>" />
                                           <asp:Label runat="server" ID="Label3" Text="<%# Container.Owner.TotalRowCount%>" />
                                           <br />

    Here's my code-behind:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.DataVisualization.Charting;
    using Telerik.Web.UI;
    namespace KMI.IntelliDrive.Appl.Web.UI.test
        public partial class DougRadDataPagerTest1 : System.Web.UI.Page
            //protected void Page_Load(object sender, EventArgs e)
            protected override void OnPreRender(EventArgs e)
                if (Session["DUMMYDATA"] == null)
                    Dictionary<String, Int32> dummy = new Dictionary<string, int>();
                    dummy.Add("one", 1);
                    dummy.Add("two", 2);
                    dummy.Add("three", 3);
                    dummy.Add("seven", 7);
                    dummy.Add("fortytwo", 42);
                    dummy.Add("five", 5);
                    dummy.Add("elevensies", 11);
                    dummy.Add("mastodon", 10);
                    dummy.Add("rock", 2);
                    dummy.Add("splunge", 14);
                    dummy.Add("parrot", 15);
                    dummy.Add("defenestrate", 16);
                    dummy.Add("cat", 17);
                    dummy.Add("window", 18);
                    Session["DUMMYDATA"] = dummy;
                newChart.DataSource = Session["DUMMYDATA"] as Dictionary<String, Int32>;
            private void SetCommonControls()
                string myEntityTitle = "Doug Test";
                Series ser = new Series(myEntityTitle + " Change in Dollars");
                ser.Name = myEntityTitle;
                ser.ChartType = SeriesChartType.Bar;
                ser.XValueMember = "key";
                ser.YValueMembers = "value";
                // Add the series to the chart.
                // DCB FIXME trying paging
                //_chart.PagingEnabled = true;
                newChart.Titles[0].Text = myEntityTitle;
                //Set up click event properties
                //newChart.Series[0].PostBackValue = "#SERIESNAME;#AXISLABEL;#VALY;#INDEX";
            protected void Button1_Click(object sender, EventArgs e)

    And here's the extended chart class (though the problem does not seem to be related to this class):

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI.DataVisualization.Charting;
    using Telerik.Web.UI;
    using System.Collections;
    namespace IntelliDrive.Charting
        public class PageableChart : Chart, IRadPageableItemContainer
            public Boolean PagingEnabled;
            private Dictionary<String, Int32> _pagedDataSource;
            public override void DataBind()
                int startRowIndex = ViewState["_startRowIndex"] != null ? (int)ViewState["_startRowIndex"] : 0;
                int rowsPerPage = ViewState["_rowsPerPage"] != null ? (int)ViewState["_rowsPerPage"] : 10;
                //// intercept the original data source, and databind to the proper range
                //// by interpreting the paging information if paging is enabled.
                int totalRows = 0;
                if (PagingEnabled)
                    // calculate the range based on paging member variables.
                    if ((DataSource as Dictionary<String, Int32>) != null)
                        Dictionary<String,Int32> ds = DataSource as Dictionary<String,Int32>;
                        // This section pulls the selected "page" of data out of the full datasource.
                        totalRows = ds.Count;
                        int rowIndex = 0;
                        _pagedDataSource = new Dictionary<string,int>();
                        foreach (String s in ds.Keys)
                            if (rowIndex >= startRowIndex && rowIndex < startRowIndex + rowsPerPage)
                                _pagedDataSource[s] = ds[s];
                        this.DataSource = _pagedDataSource;
                        throw new ApplicationException("DCB FIXME - Can't cast the DataSource to Dictionary<String,Int32>, or DataSource isn't set by DataBind().");
                // fire this event AFTER the databind? FIXME could this be placed up in the prior PagingEnabled block for cleanness?
                if (PagingEnabled)
                    OnTotalRowCountAvailable(new RadDataPagerPageEventArgs(startRowIndex, rowsPerPage, totalRows));
            #region IRadPageableItemContainer Members
            public int MaximumRows
                get { return ViewState["_rowsPerPage"] != null ? (int)ViewState["_rowsPerPage"] : 7; }
            // Why does "startRowIndex" always show up as 0? The pager never changes it...
            public void SetPageProperties(int startRowIndex, int maximumRows, bool databind)
                this.ViewState["_startRowIndex"] = startRowIndex;
                this.ViewState["_rowsPerPage"] = maximumRows;
                // it's got to re-bind since we bind manually to the paged data.
                RequiresDataBinding = true;
            public int StartRowIndex
                get { return (ViewState["_startRowIndex"] != null ? (int)ViewState["_startRowIndex"] : 0); }
            public event EventHandler<RadDataPagerPageEventArgs> TotalRowCountAvailable;
            protected virtual void OnTotalRowCountAvailable(RadDataPagerPageEventArgs e)
                if (TotalRowCountAvailable != null)
                    TotalRowCountAvailable(this, e);

  2. Nikolay Rusev
    Nikolay Rusev avatar
    2289 posts

    Posted 06 Aug 2010 Link to this post

    Hello Douglas,

    I believe the problem that you are facing are due to the fact that controls collection of Chart control is created on PreRender. This prevents event bubbling of the commands from pager control buttons.

    You can try implementing IPageableItemContainer and use DataPager. I believe you will expedience same behavior.

    All the best,
    the Telerik team

    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  3. Doug Bodden
    Doug Bodden avatar
    1 posts
    Member since:
    Apr 2010

    Posted 09 Aug 2010 Link to this post

    Thank you.

    As you suggested, I did try the standard MS .Net 3.5 controls and saw the same behavior.

    However, I found that by executing the SetPageProperties method in both OnLoad (with a dummy value for totalrows if !IsPostBack) and in OnPreRender (with correct values), I was able to get the pager working properly with the RadDataPager.

Back to Top