I need to use drill down with drag and drop and integration with chart. i have used the samples to use drill down functionality. however, when i try to drag and drop one of the filterfield to row/column field. it shows the error to get correct count of rowfileld or columnfield. i tried to move code from on init to other places but it gives the error either way.
can you please help on this?
<style> .breadcrumb { padding: 4px 10px !important; margin-bottom: 10px !important; list-style: none; background-color: #f5f5f5; border-radius: 4px;}</style> <telerik:RadCodeBlock runat="server"> <style type="text/css"> .rpgContentZone th[onclick], .rpgContentZone td[onclick] { cursor: pointer; } </style> <script type="text/javascript"> function OpenDetailsWindow(argument) { $find("<%= RadAjaxPanel1.ClientID %>").ajaxRequest(argument); } </script> </telerik:RadCodeBlock><div> <!--start of breadcrumb--> <ol class="breadcrumb container"> <li class="active">Incident Navigator</li> <li class="active">Trending</li> </ol> <telerik:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server"> </telerik:RadAjaxLoadingPanel> <telerik:RadAjaxManagerProxy ID="AjaxManagerProxy1" runat="server"> <AjaxSettings> <telerik:AjaxSetting AjaxControlID="RadPivotGrid1"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="RadPivotGrid1" LoadingPanelID="RadAjaxLoadingPanel1" /> <telerik:AjaxUpdatedControl ControlID="RadHtmlChart1" LoadingPanelID="RadAjaxLoadingPanel1" /> </UpdatedControls> </telerik:AjaxSetting> <telerik:AjaxSetting AjaxControlID="rdComboTicketType"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="RadPivotGrid1" LoadingPanelID="RadAjaxLoadingPanel1" /> <telerik:AjaxUpdatedControl ControlID="RadHtmlChart1" LoadingPanelID="RadAjaxLoadingPanel1" /> </UpdatedControls> </telerik:AjaxSetting> </AjaxSettings> </telerik:RadAjaxManagerProxy> <div class="container" style="padding: 0;"> <div style="vertical-align:top;text-align:center;"> <telerik:RadLabel runat="server" ID="lblReport" CssClass="reportlbl"> </telerik:RadLabel> </div> <telerik:RadHtmlChart ID="RadHtmlChart1" Height="350px" runat="server" Visible="true" Legend-Appearance-Position="Bottom" PlotArea-XAxis-LabelsAppearance-RotationAngle="45" PlotArea-YAxis-MinValue="0" PlotArea-YAxis-Type="Numeric"> <%-- <ChartTitle > <Appearance Align="Center" BackgroundColor="Transparent" Position="Top"> <TextStyle FontSize="13" FontFamily="Helvetica Neue, Helvetica, Arial, sans-serif;" Bold="true" /> </Appearance> </ChartTitle> --%> </telerik:RadHtmlChart> <br /> <telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" EnableAJAX="true" OnAjaxRequest="RadAjaxPanel1_AjaxRequest" LoadingPanelID="RadAjaxLoadingPanel1"> <telerik:RadPivotGrid RenderMode="Lightweight" runat="server" ID="RadPivotGrid1" AllowPaging="false" OnCellDataBound="RadPivotGrid1_CellDataBound" OnNeedDataSource="RadPivotGrid1_NeedDataSource" OnDataBinding="RadPivotGrid1_DataBinding" OnItemCommand="RadPivotGrid1_ItemCommand" AllowSorting="true" AllowFiltering="true" ShowFilterHeaderZone="true" EnableZoneContextMenu="true" > <%-- <PagerStyle Mode="NextPrevNumericAndAdvanced" AlwaysVisible="true"></PagerStyle>--%> <DataCellStyle Width="50px" /> <Fields> <telerik:PivotGridColumnField DataField="Year"> </telerik:PivotGridColumnField> <telerik:PivotGridReportFilterField DataField="Quarter" > </telerik:PivotGridReportFilterField> <telerik:PivotGridReportFilterField DataField="AffectedItemName" Caption="Application" > </telerik:PivotGridReportFilterField> <telerik:PivotGridReportFilterField DataField="WorkgroupName" Caption="Assignment group" > </telerik:PivotGridReportFilterField> <telerik:PivotGridReportFilterField DataField="Level" Caption="Service Level" > </telerik:PivotGridReportFilterField> <telerik:PivotGridReportFilterField DataField="Severity" > </telerik:PivotGridReportFilterField> <telerik:PivotGridColumnField DataField="MonthName" SortOrder="None" > </telerik:PivotGridColumnField> <telerik:PivotGridRowField DataField="CauseCategoryName"> </telerik:PivotGridRowField> <%-- <telerik:PivotGridRowField DataField="City"> </telerik:PivotGridRowField>--%> <telerik:PivotGridAggregateField DataField="IncidentId" Aggregate="Count" SortOrder="Ascending" > </telerik:PivotGridAggregateField> </Fields> <ClientSettings EnableFieldsDragDrop="true"> <%--<Scrolling AllowVerticalScroll="true"></Scrolling>--%> <ClientMessages DragToReorder="Drag the field to change its order"></ClientMessages> </ClientSettings> </telerik:RadPivotGrid> <telerik:RadWindow ID="RadWindow1" runat="server" MinWidth="900px" MinHeight="450px"> <ContentTemplate> <telerik:RadAjaxLoadingPanel runat="server" ID="RadAjaxLoadingPanel2" Skin="Default"></telerik:RadAjaxLoadingPanel> <telerik:RadAjaxPanel ID="RadAjaxPanel2" runat="server" LoadingPanelID="RadAjaxLoadingPanel2"> <telerik:RadGrid runat="server" ID="RadGrid1" AllowSorting="true" PageSize="5" OnNeedDataSource="RadGrid1_NeedDataSource" AllowPaging="true"> </telerik:RadGrid> </telerik:RadAjaxPanel> </ContentTemplate> </telerik:RadWindow> </telerik:RadAjaxPanel> </div> <style type="text/css"> .PivotGridWindow { width: 700px !important; height: 400px !important; } .reportlbl{ font-size:small; font-family:Helvetica Neue, Helvetica, Arial, sans-serif; font-weight:bold; } </style> </div> ------------------------------- public partial class TrendingControl : System.Web.UI.UserControl { List<PivotGridField> rowFields; List<PivotGridField> columnFields; List<PivotGridField> aggregateFields; int index = 0; int[] allFakeColumnCells = null; bool isFirstDataCell = true; int countOfFakeRowCells = 0; int cellsCount = 0; string firstRowID = string.Empty; string currentRowID = string.Empty; int key = 0; public int? AffectedItemId { get { if (((MasterPage)Page.Master).AppId != null) { return ((MasterPage)Page.Master).AppId; } else { return null; } } } public List<string> TicketTypelist { get { if (((MasterPage)Page.Master).TicketTypelist != null) { return ((MasterPage)Page.Master).TicketTypelist; } else { return null; } } } public Dictionary<int, string> Arguments { get { if (Session["Arguments"] == null) { Session["Arguments"] = new Dictionary<int, string>(); } return Session["Arguments"] as Dictionary<int, string>; } set { Session["Arguments"] = value; } } public DataTable GridDataSource { get { return Session["GridDataSource"] as DataTable; } set { Session["GridDataSource"] = value; } } public List<INAffectedItem> listAffectedItemlist { get { var list = new List<INAffectedItem>(); using (var db = new Entities()) { list = db.INAffectedItems.ToList(); } return list; } } HashSet<string> columnNames = new HashSet<string>(); Dictionary<string, LineSeries> LineSeriesByRowName = new Dictionary<string, LineSeries>(); protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); if (!Page.IsPostBack) { if (AffectedItemId == 0) { using (var db = new Entities()) { var v = db.IN_Trending_dS(string.Join(",", TicketTypelist)); string year = v.Max(x => x.Year).GetValueOrDefault().ToString(); RadPivotGrid1.FilterByLabel(PivotGridFilterFunction.Equals, RadPivotGrid1.Fields["Year"], year); //RadPivotGrid1.FilterByValue(PivotGridFilterFunction.Top, RadPivotGrid1.Fields["AffectedItemName"], RadPivotGrid1.Fields["IncidentId"] as PivotGridAggregateField, "5"); } } else { using (var db = new Entities()) { var v = db.IN_TrendingByAffectedItem_dS(AffectedItemId.Value, string.Join(",", TicketTypelist)); var year = v.Max(x => x.Year).GetValueOrDefault().ToString(); RadPivotGrid1.FilterByLabel(PivotGridFilterFunction.Contains, RadPivotGrid1.Fields["Year"], year); } } } //for (int i = 0; i < RadPivotGrid1.Fields.Count; i++) //{ // RadPivotGrid1.Fields[i].Caption = (i + 1).ToString(); //} RadPivotGrid1.Fields["CauseCategoryName"].Caption = ClosureCategoryName; //RadPivotGrid1.ColumnGroupsDefaultExpanded = false; //RadPivotGrid1.RowGroupsDefaultExpanded = false; columnNames = new HashSet<string>(); LineSeriesByRowName = new Dictionary<string, LineSeries>(); RadPivotGrid1.Rebind(); // rowFields = RadPivotGrid1.Fields.Where(f => //f is PivotGridRowField && f.IsHidden == false).OrderBy(f => f.ZoneIndex).ToList(); // columnFields = RadPivotGrid1.Fields.Where(f => // f is PivotGridColumnField && f.IsHidden == false).OrderBy(f => f.ZoneIndex).ToList(); // aggregateFields = RadPivotGrid1.Fields.Where(f => // f is PivotGridAggregateField && f.IsHidden == false).OrderBy(f => f.ZoneIndex).ToList(); } protected override void OnInit(EventArgs e) { base.OnInit(e); rowFields = RadPivotGrid1.Fields.Where(f => f is PivotGridRowField && f.IsHidden == false).OrderBy(f => f.ZoneIndex).ToList(); columnFields = RadPivotGrid1.Fields.Where(f => f is PivotGridColumnField && f.IsHidden == false).OrderBy(f => f.ZoneIndex).ToList(); aggregateFields = RadPivotGrid1.Fields.Where(f => f is PivotGridAggregateField && f.IsHidden == false).OrderBy(f => f.ZoneIndex).ToList(); } protected void Page_Load(object sender, EventArgs e) { if (AffectedItemId == 0) { lblReport.Text = "Monthly Incidents by " + ClosureCategoryName + " for All Applications"; } else { var v = listAffectedItemlist.Where(x => x.Id == AffectedItemId.Value).FirstOrDefault(); lblReport.Text = "Monthly Incidents by " + ClosureCategoryName + " for " + v.AffectedItemName; } //this.RadHtmlChart1.PlotArea.XAxis.Items.Clear(); //this.RadHtmlChart1.PlotArea.Series.Clear(); // RadPivotGrid1.Rebind(); } public static DataTable ToDataTable<T>(List<T> items) { DataTable dataTable = new DataTable(typeof(T).Name); //Get all the properties PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo prop in Props) { //Defining type of data column gives proper data table var type = (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType); //Setting column names as Property names dataTable.Columns.Add(prop.Name, type); } foreach (T item in items) { var values = new object[Props.Length]; for (int i = 0; i < Props.Length; i++) { //inserting property values to datatable rows values[i] = Props[i].GetValue(item, null); } dataTable.Rows.Add(values); } //put a breakpoint here and check datatable return dataTable; } protected void RadPivotGrid1_NeedDataSource(object sender, Telerik.Web.UI.PivotGridNeedDataSourceEventArgs e) { if (AffectedItemId == 0) { using (var db = new Entities()) { var v = db.IN_Trending_dS(string.Join(",", TicketTypelist)); (sender as RadPivotGrid).DataSource = ToDataTable(v.OrderBy(x => x.Year).ThenBy(x => x.Month).ToList()); } } else { using (var db = new Entities()) { var v = db.IN_TrendingByAffectedItem_dS(AffectedItemId.Value, string.Join(",", TicketTypelist)); if (v != null) { var selectedAppsource = v.OrderBy(x => x.Year).ThenBy(x => x.Month).ToList(); (sender as RadPivotGrid).DataSource = ToDataTable(selectedAppsource); } } } } protected void RadPivotGrid1_CellDataBound(object sender, PivotGridCellDataBoundEventArgs e) { PivotGridDataCell cell = e.Cell as PivotGridDataCell; if (cell != null) { // If this is the first data cell we need to populate the collecion which fake columns cells count if (isFirstDataCell) { PopulateFakeColumnsCellCollection(cell); isFirstDataCell = false; } // We do not need to attach onclick event on cell which does not have values if (cell.DataItem != null) { string argument = GetCommandArguments(cell); string script = string.Format("OpenDetailsWindow('{0}')", argument); cell.Attributes.Add("onclick", script); } index++; } PivotGridDataCell dataCell = e.Cell as PivotGridDataCell; if (columnNames.Count == 0) { this.RadHtmlChart1.PlotArea.XAxis.Items.Clear(); this.RadHtmlChart1.PlotArea.Series.Clear(); //if (AffectedItemId == 0) //{ // this.RadHtmlChart1.ChartTitle.Text = "Monthly Incidents by Closure Category for All Applications"; //} //else //{ // var v = listIncidentlist.Where(x => x.AffectedItemId == AffectedItemId.Value).FirstOrDefault(); // this.RadHtmlChart1.ChartTitle.Text = "Monthly Incidents by Closure Category for " + v.AffectedItemName; //} } if (dataCell != null && dataCell.CellType == PivotGridDataCellType.DataCell) { string rowName = GetName(dataCell.ParentRowIndexes); //if(dataCell.ParentColumnIndexes[1]!= null) //{ // int month = 0; // if (int.TryParse(dataCell.ParentColumnIndexes[1].ToString(), out month)) // { // dataCell.ParentColumnIndexes[1]= CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(int.Parse(dataCell.ParentColumnIndexes[1].ToString())); // } //} string columnName = GetName(dataCell.ParentColumnIndexes); columnName = columnName.Replace('\'', ' '); if (columnNames.Add(columnName)) { AxisItem axisItem = new AxisItem(columnName); this.RadHtmlChart1.PlotArea.XAxis.Items.Add(axisItem); } LineSeries lineSeries = null; if (LineSeriesByRowName.ContainsKey(rowName)) { lineSeries = LineSeriesByRowName[rowName]; } else { lineSeries = new LineSeries(); LineSeriesByRowName.Add(rowName, lineSeries); lineSeries.Name = rowName; // columnSeries.LabelsAppearance.DataFormatString = "C"; this.RadHtmlChart1.PlotArea.Series.Add(lineSeries); } lineSeries.LabelsAppearance.Visible = false; CategorySeriesItem item = new CategorySeriesItem(); int value = 0; if (e.Cell.DataItem != null && int.TryParse(e.Cell.DataItem.ToString(), out value)) { item.Y = value; } else { item.Y = null; } lineSeries.SeriesItems.Add(item); } } // This methos is executed only for the first cell from the first row private void PopulateFakeColumnsCellCollection(PivotGridDataCell cell) { PivotGridDataItem item = cell.NamingContainer as PivotGridDataItem; cellsCount = item.Cells.Count; allFakeColumnCells = new int[cellsCount]; firstRowID = item.UniqueID; for (int i = 0; i < cellsCount; i++) { int countOfFakeCells = GetCountOfFakeColumnCells(item.Cells[i] as PivotGridDataCell); allFakeColumnCells[i] = countOfFakeCells; } } private string GetName(object[] indexes) { StringBuilder builder = new StringBuilder(); foreach (object index in indexes) { builder.Append(index.ToString()); builder.Append("/"); } builder.Remove(builder.Length - 1, 1); return builder.ToString(); } protected void RadPivotGrid1_DataBinding(object sender, EventArgs e) { Arguments.Clear(); } protected void RadPivotGrid1_ItemCommand(object sender, PivotGridCommandEventArgs e) { RadWindow1.VisibleOnPageLoad = false; } protected void RadAjaxPanel1_AjaxRequest(object sender, AjaxRequestEventArgs e) { StringBuilder whereClause = new StringBuilder(); if (!string.IsNullOrEmpty(e.Argument.ToString())) { string[] elements = e.Argument.ToString().Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); foreach (var element in elements) { var group = element.Split(new char[] { '~' }, StringSplitOptions.RemoveEmptyEntries); int firstPart = Convert.ToInt32(group[0]); int secondPart = Convert.ToInt32(group[1]); whereClause.Append(string.Format("{0} = '{1}' AND ", Arguments[firstPart], Arguments[secondPart])); } // Remove the last " AND " clause whereClause.Remove(whereClause.Length - 5, 5); GridDataSource = GetTable(); //GridDataSource = GetDataTable(string.Format("SELECT * FROM Transportation WHERE {0}", whereClause.ToString())); } //Executed when row and column grandtotal cell is clicked else { GridDataSource = GetTable(); } RadWindow1.VisibleOnPageLoad = true; RadGrid1.Rebind(); } static DataTable GetTable() { // Here we create a DataTable with four columns. DataTable table = new DataTable(); table.Columns.Add("Dosage", typeof(int)); table.Columns.Add("Drug", typeof(string)); table.Columns.Add("Patient", typeof(string)); table.Columns.Add("Date", typeof(DateTime)); // Here we add five DataRows. table.Rows.Add(25, "Indocin", "David", DateTime.Now); table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now); table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now); table.Rows.Add(21, "Combivent", "Janet", DateTime.Now); table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now); return table; } public string GetCommandArguments(PivotGridDataCell cell) { // True when first cell of each row is hit if (currentRowID != cell.NamingContainer.UniqueID) { index = 0; currentRowID = cell.NamingContainer.UniqueID; countOfFakeRowCells = GetCountOfFakeRowCells(cell); } object[] rowIndexes = cell.ParentRowIndexes; object[] columnIndexes = cell.ParentColumnIndexes; int rowIndexesCount = rowIndexes.Count(); int columnIndexesCount = columnIndexes.Count(); int countOfFakeColumnCells = allFakeColumnCells[index]; rowIndexesCount -= countOfFakeRowCells; columnIndexesCount -= countOfFakeColumnCells; StringBuilder buider = BuildArguments(rowIndexes, columnIndexes, rowIndexesCount, columnIndexesCount); return buider.ToString(); } private StringBuilder BuildArguments(object[] rowIndexes, object[] columnIndexes, int rowIndexesCount, int columnIndexesCount) { StringBuilder buider = new StringBuilder(); ReplaceArgumentsWithNumbers(rowIndexes, rowFields, rowIndexesCount, buider); ReplaceArgumentsWithNumbers(columnIndexes, columnFields, columnIndexesCount, buider); // Remove the semicolon in the end if (buider.Length > 1) { buider.Remove(buider.Length - 1, 1); } return buider; } private void ReplaceArgumentsWithNumbers(object[] cellIndexes, List<PivotGridField> fields, int indexesCount, StringBuilder buider) { for (int i = 0; i < indexesCount; i++) { string firstPart = fields[i].DataField; string secondPart = cellIndexes[i].ToString(); if (Arguments.ContainsValue(firstPart)) { buider.Append(Arguments.FirstOrDefault(a => a.Value == firstPart).Key); AppendSecondParts(buider, secondPart); } else { Arguments.Add(key, firstPart); buider.Append(string.Format("{0}", key.ToString())); key++; AppendSecondParts(buider, secondPart); } } } private void AppendSecondParts(StringBuilder buider, string secondPart) { if (Arguments.ContainsValue(secondPart)) { buider.Append(string.Format("~{0};", Arguments.FirstOrDefault(a => a.Value == secondPart).Key)); } else { Arguments.Add(key, secondPart); buider.Append(string.Format("~{0};", key.ToString())); key++; } } private int GetCountOfFakeColumnCells(PivotGridDataCell cell) { int count = 0; if (aggregateFields.Count > 1) { if (RadPivotGrid1.AggregatesPosition == PivotGridAxis.Columns) { if (cell.CellType == PivotGridDataCellType.DataCell || cell.CellType == PivotGridDataCellType.RowTotalDataCell || cell.CellType == PivotGridDataCellType.RowAndColumnTotal || cell.CellType == PivotGridDataCellType.RowGrandTotalDataCell || cell.CellType == PivotGridDataCellType.ColumnGrandTotalRowTotal) { count++; } } } // if column total or grand total cell is hit we need to escape its values from query if (cell.CellType == PivotGridDataCellType.ColumnTotalDataCell || cell.CellType == PivotGridDataCellType.RowAndColumnTotal || cell.CellType == PivotGridDataCellType.ColumnGrandTotalRowTotal || cell.CellType == PivotGridDataCellType.ColumnGrandTotalDataCell || cell.CellType == PivotGridDataCellType.RowGrandTotalColumnTotal) { count++; } return count; } private int GetCountOfFakeRowCells(PivotGridDataCell cell) { int count = 0; //if aggregates are more than one additional cells are rendered, so we need to exclude their values from the query if (aggregateFields.Count > 1) { if (RadPivotGrid1.AggregatesPosition == PivotGridAxis.Rows) { if (cell.CellType != PivotGridDataCellType.RowTotalDataCell && cell.CellType != PivotGridDataCellType.ColumnGrandTotalRowTotal) { count++; } } } // if row total or grand total cell is hit we need to escape its values from query if (cell.CellType == PivotGridDataCellType.RowTotalDataCell || cell.CellType == PivotGridDataCellType.ColumnGrandTotalRowTotal || cell.CellType == PivotGridDataCellType.RowGrandTotalDataCell) { count++; } return count; } protected void RadGrid1_NeedDataSource(object sender, GridNeedDataSourceEventArgs e) { RadGrid1.DataSource = GridDataSource; } }}