So here's the scenario that I have:
I have a dashboard that has multiple radgrids in it. These rad grids are one offs (in other words no update, delete, add). I want to be able to let the users click on a row and redirect to a report page. All of this works until I want to have each radgrid update every 5 seconds. The calls are made from code behind. I thought about adding a ticker like the example here:
http://demos.telerik.com/aspnet-ajax/grid/examples/client/livedata/defaultcs.aspx
However this doesn't work because the data I am pulling is designed to work for an increasing number of rad grids so if the client decided they want to add another radgrid they can. I use a lambda expression to parse the object from code behind. Which isn't really possible to do from javascript and ajax (that I am aware of). If I add the static classes this makes the display to brittle and will require maintenance more often than I wanted.
So I decided to go with the update panel binding the ajaxmanager to the radgrid at instantiation of the radgrid. Here's my current problem. If I bind the update panel I need to assign an ID to reference the control. If I pass in the control during instantiation then I have to create concrete NeedDataSource classes. Is there any way to create n number of rad grids from code behind and then have the following abilities:
1. Allow row clicked events
2. update every interval
I keep getting i.get_postBackElement() is undefined. Here's a look at some of the code I have (that doesn't work):
Code Behind:
I have a dashboard that has multiple radgrids in it. These rad grids are one offs (in other words no update, delete, add). I want to be able to let the users click on a row and redirect to a report page. All of this works until I want to have each radgrid update every 5 seconds. The calls are made from code behind. I thought about adding a ticker like the example here:
http://demos.telerik.com/aspnet-ajax/grid/examples/client/livedata/defaultcs.aspx
However this doesn't work because the data I am pulling is designed to work for an increasing number of rad grids so if the client decided they want to add another radgrid they can. I use a lambda expression to parse the object from code behind. Which isn't really possible to do from javascript and ajax (that I am aware of). If I add the static classes this makes the display to brittle and will require maintenance more often than I wanted.
So I decided to go with the update panel binding the ajaxmanager to the radgrid at instantiation of the radgrid. Here's my current problem. If I bind the update panel I need to assign an ID to reference the control. If I pass in the control during instantiation then I have to create concrete NeedDataSource classes. Is there any way to create n number of rad grids from code behind and then have the following abilities:
1. Allow row clicked events
2. update every interval
I keep getting i.get_postBackElement() is undefined. Here's a look at some of the code I have (that doesn't work):
<
asp:Content
ID
=
"Content2"
ContentPlaceHolderID
=
"MainContent"
runat
=
"Server"
>
<
telerik:RadAjaxManager
ID
=
"RadAjaxManager1"
runat
=
"server"
>
</
telerik:RadAjaxManager
>
<
telerik:RadAjaxLoadingPanel
ID
=
"LoadingPanel1"
runat
=
"server"
/>
<
fieldset
id
=
"Facility"
class
=
"dashboardFieldsetDisplay"
>
<
legend
>Facility Data</
legend
>
<
asp:Panel
ID
=
"FacilityGrids"
runat
=
"server"
CssClass
=
"dashboardGrid"
></
asp:Panel
>
</
fieldset
>
<
fieldset
id
=
"Company"
class
=
"dashboardFieldsetDisplay"
>
<
legend
>Company Data</
legend
>
<
asp:Panel
ID
=
"CompanyGrids"
runat
=
"server"
CssClass
=
"dashboardGrid"
></
asp:Panel
>
</
fieldset
>
<
fieldset
id
=
"Region"
class
=
"dashboardFieldsetDisplay"
>
<
legend
>Region Data</
legend
>
<
asp:Panel
ID
=
"RegionGrids"
runat
=
"server"
CssClass
=
"dashboardGrid"
></
asp:Panel
>
</
fieldset
>
<
div
class
=
"clearBoth"
></
div
>
<
div
class
=
"displayNone"
>
<
asp:Timer
ID
=
"Ticker"
runat
=
"server"
OnTick
=
"Ticker_Ticked"
></
asp:Timer
>
</
div
>
</
asp:Content
>
Code Behind:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Web;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
PCSGroup.Freund;
using
Telerik.Web.UI;
public
partial
class
_default : Base
{
private
List<DateTime> dateRange =
new
List<DateTime>();
private
List<RegionalSales> allRegionalSales =
new
List<RegionalSales>();
private
List<FacilitySales> allFacilitySales =
new
List<FacilitySales>();
private
List<CompanySales> allCompanySales =
new
List<CompanySales>();
private
List<RadGrid> listOfGrids =
new
List<RadGrid>();
private
int
dashboardWidth = 235;
protected
override
void
OnInit(EventArgs e)
{
base
.OnInit(e);
int
count = 0;
while
(count < 5)
{
dateRange.Add(DateTime.Now.Date.AddDays(count));
count++;
}
foreach
(DateTime day
in
dateRange)
{
//loops through the region sales object and creates a list of regionalsales if any exist for that date
RegionalSales regionOrders =
new
RegionalSales(day);
allRegionalSales.AddRange(regionOrders.SelectOrders());
//loops through the facility sales object and creates a list of facilitysales if any exist for that date
FacilitySales facilityOrders =
new
FacilitySales(day);
allFacilitySales.AddRange(facilityOrders.SelectOrders());
//loops through the company sales object and creates a list of companysales if any exist for that date
CompanySales companyOrders =
new
CompanySales(day);
allCompanySales.AddRange(companyOrders.SelectOrders());
}
}
protected
override
void
OnLoad(EventArgs e)
{
base
.OnLoad(e);
Ticker.Interval = 3000;
foreach
(Region region
in
new
Region().SelectAllRegionsNotDeleted())
{
Panel gridWrapper =
new
Panel();
gridWrapper.Width = 250;
gridWrapper.CssClass =
"floatLeft"
;
Literal regionHead =
new
Literal();
regionHead.Text = String.Format(
"<h2>{0}</h2>"
, region.RegionName);
gridWrapper.Controls.Add(regionHead);
gridWrapper.Controls.Add(GetRegionChart(region.RegionID));
RegionGrids.Controls.Add(gridWrapper);
}
foreach
(Facility facility
in
new
Facility().SelectAllFacilitiesNotDeleted())
{
Literal facilityHead =
new
Literal();
facilityHead.Text = String.Format(
"<h2>{0}</h2>"
, facility.FacilityName);
FacilityGrids.Controls.Add(facilityHead);
FacilityGrids.Controls.Add(GetFacilityChart(facility.FacilityID));
}
foreach
(Company company
in
new
Company().SelectAllCompaniesNotDeleted().Where(i => i.CompanyID != 2).ToList())
{
Panel gridWrapper =
new
Panel();
gridWrapper.Width = 250;
gridWrapper.CssClass =
"floatLeft"
;
Literal companyHead =
new
Literal();
companyHead.Text = String.Format(
"<h2>{0}</h2>"
, company.CompanyName);
gridWrapper.Controls.Add(companyHead);
gridWrapper.Controls.Add(GetCompanyChart(company.CompanyID));
CompanyGrids.Controls.Add(gridWrapper);
}
}
protected
void
Company3_NeedDataSource(
object
sender, GridNeedDataSourceEventArgs e)
{
RadGrid company = listOfGrids.FirstOrDefault(i => i.ID ==
"Company_3"
);
company.DataSource = allCompanySales.Where(i => i.CompanyID == 3);
}
public
void
Ticker_Ticked(
object
sender, EventArgs e)
{
foreach
(RadGrid grid
in
listOfGrids)
{
grid.Rebind();
}
}
private
RadGrid GetRegionChart(
int
ID)
{
string
[] keys = {
"RegionID"
,
"DeliveryDate"
};
RadGrid thisView =
new
RadGrid();
thisView.CssClass =
"roundedCorners"
;
thisView.Skin = Skin;
thisView.Width = dashboardWidth;
thisView.AutoGenerateColumns =
false
;
thisView.GridLines = GridLines.None;
thisView.MasterTableView.Width = Unit.Percentage(100);
thisView.MasterTableView.NoMasterRecordsText =
string
.Empty;
thisView.MasterTableView.ClientDataKeyNames = keys;
thisView.ClientSettings.ClientEvents.OnRowClick =
"RegionRowClick"
;
thisView.DataSource = allRegionalSales.Where(i => i.RegionID == ID);
GridBoundColumn boundColumn;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"DeliveryDate"
;
boundColumn.HeaderText =
"Date"
;
boundColumn.DataFormatString =
"{0:MM/dd}"
;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"NewCount"
;
boundColumn.HeaderText =
"New"
;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"RenewedCount"
;
boundColumn.HeaderText =
"Renewed"
;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"CancelledCount"
;
boundColumn.HeaderText =
"Cancelled"
;
listOfGrids.Add(thisView);
return
thisView;
}
private
RadGrid GetFacilityChart(
int
ID)
{
string
[] keys = {
"FacilityID"
,
"DeliveryDate"
};
RadGrid thisView =
new
RadGrid();
thisView.CssClass =
"roundedCorners"
;
thisView.Skin = Skin;
thisView.Width = dashboardWidth;
thisView.AutoGenerateColumns =
false
;
thisView.GridLines = GridLines.None;
thisView.ID = String.Format(
"FacilityID_{0}"
, ID);
thisView.MasterTableView.Width = Unit.Percentage(100);
thisView.MasterTableView.NoMasterRecordsText =
string
.Empty;
thisView.MasterTableView.ClientDataKeyNames = keys;
thisView.ClientSettings.ClientEvents.OnRowClick =
"FacilityRowClick"
;
thisView.DataSource = allFacilitySales.Where(i => i.FacilityID == ID);
GridBoundColumn boundColumn;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"DeliveryDate"
;
boundColumn.HeaderText =
"Date"
;
boundColumn.DataFormatString =
"{0:MM/dd}"
;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"NewCount"
;
boundColumn.HeaderText =
"New"
;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"RenewedCount"
;
boundColumn.HeaderText =
"Renewed"
;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"CancelledCount"
;
boundColumn.HeaderText =
"Cancelled"
;
listOfGrids.Add(thisView);
return
thisView;
}
private
RadGrid GetCompanyChart(
int
ID)
{
string
[] keys = {
"CompanyID"
,
"DeliveryDate"
};
RadGrid thisView =
new
RadGrid();
thisView.CssClass =
"roundedCorners"
;
thisView.Skin = Skin;
thisView.Width = dashboardWidth;
thisView.AutoGenerateColumns =
false
;
thisView.GridLines = GridLines.None;
thisView.ID = String.Format(
"Company_{0}"
, ID);
thisView.MasterTableView.Width = Unit.Percentage(100);
thisView.MasterTableView.NoMasterRecordsText =
string
.Empty;
thisView.MasterTableView.ClientDataKeyNames = keys;
thisView.ClientSettings.ClientEvents.OnRowClick =
"CompanyRowClick"
;
/*
!!!! Here's the code that doesn't work !!!!
I am creating a reference to a method
that does makes my code very brittle.
*/
if
(ID == 3)
{
thisView.NeedDataSource +=
new
GridNeedDataSourceEventHandler(Company3_NeedDataSource);
}
RadAjaxManager1.DefaultLoadingPanelID =
"LoadingPanel1"
;
RadAjaxManager1.AjaxSettings.AddAjaxSetting(Ticker, thisView,
null
);
// End Broken Code
thisView.DataSource = allCompanySales.Where(i => i.CompanyID == ID);
GridBoundColumn boundColumn;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"DeliveryDate"
;
boundColumn.HeaderText =
"Date"
;
boundColumn.DataFormatString =
"{0:MM/dd}"
;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"NewCount"
;
boundColumn.HeaderText =
"New"
;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"RenewedCount"
;
boundColumn.HeaderText =
"Renewed"
;
boundColumn =
new
GridBoundColumn();
thisView.MasterTableView.Columns.Add(boundColumn);
boundColumn.DataField =
"CancelledCount"
;
boundColumn.HeaderText =
"Cancelled"
;
listOfGrids.Add(thisView);
return
thisView;
}
}