I have a scenario in which a user may select from a number of predefined queries which loads a RadGrid. The grid is generated dynamically as the columns may vary from query to query. This is all working until I tried adding DetailTables for the MasterTableView. I tried to recreate my issue by following examples in documentation and it all worked, until I added a button that would simulate the selection of a query. If the grid is added to the control collection initially without any DetailTables it seems like it is impossible to add one later. Is this by design?
Here is the code for my sample application.
Any thoughts or advice would be very appreciated.
Thanks,
Adam
Here is the code for my sample application.
protected void Page_Init(object sender, System.EventArgs e) |
{ |
PopulateGridOnPageInit(); |
} |
private bool LoadGrid() |
{ |
//Hidden field is set true when "Load Grid" button is clicked |
string loadGrid = Request.Form.Get(this.uxHiddenField_LoadGrid.UniqueID); |
if (!string.IsNullOrEmpty(loadGrid)) |
{ |
return Boolean.Parse(loadGrid); |
} |
else |
{ |
return false; |
} |
} |
private void PopulateGridOnPageInit() |
{ |
RadGrid radGrid = new RadGrid(); |
radGrid.ID = RadGridId; |
if (!LoadGrid()) |
{ |
radGrid.Visible = false; |
// Add the Grid to the page |
uxPlaceHolder.Controls.Add(radGrid); |
return; |
} |
// Set properties |
radGrid.Skin = "Vista"; |
radGrid.PageSize = 25; |
radGrid.AllowPaging = true; |
radGrid.AllowCustomPaging = true; |
radGrid.AllowSorting = true; |
radGrid.MasterTableView.AllowCustomSorting = true; |
radGrid.MasterTableView.EnableColumnsViewState = false; |
radGrid.PagerStyle.Mode = GridPagerMode.NextPrevAndNumeric; |
radGrid.ClientSettings.Selecting.AllowRowSelect = true; |
radGrid.ClientSettings.Selecting.EnableDragToSelectRows = false; |
radGrid.ClientSettings.Resizing.AllowColumnResize = false; |
radGrid.ClientSettings.Resizing.ClipCellContentOnResize = false; |
radGrid.ClientSettings.Resizing.EnableRealTimeResize = false; |
radGrid.ClientSettings.ReorderColumnsOnClient = false; |
radGrid.ClientSettings.AllowColumnsReorder = false; |
radGrid.ClientSettings.ColumnsReorderMethod = GridClientSettings.GridColumnsReorderMethod.Reorder; |
radGrid.ShowGroupPanel = false; |
radGrid.GroupingEnabled = false; |
radGrid.GroupPanel.Visible = false; |
radGrid.ShowFooter = false; |
radGrid.MasterTableView.ShowFooter = false; |
// Selecting multiple rows (client-side) |
radGrid.AllowMultiRowSelection = true; |
GridClientSelectColumn gridClientSelectColumn = new GridClientSelectColumn(); |
gridClientSelectColumn.ItemStyle.Width = Unit.Percentage(1); |
radGrid.Columns.Add(gridClientSelectColumn); |
// Build the columns dynamically |
radGrid.AutoGenerateColumns = false; |
GridBoundColumn column = new GridBoundColumn(); |
column.DataField = "ID"; |
column.HeaderText = "Customer Identifier"; |
radGrid.Columns.Add(column); |
column = new GridBoundColumn(); |
column.DataField = "Name"; |
column.HeaderText = "Name"; |
radGrid.Columns.Add(column); |
column = new GridBoundColumn(); |
column.DataField = "Company"; |
column.HeaderText = "Company"; |
radGrid.Columns.Add(column); |
GridTableView childTable = new GridTableView(radGrid); |
childTable.Width = Unit.Percentage(100); |
childTable.DataMember = "CustomerID"; |
column = new GridBoundColumn(); |
column.DataField = "ID"; |
column.HeaderText = "Order Identifier"; |
childTable.Columns.Add(column); |
column = new GridBoundColumn(); |
column.DataField = "OrderDate"; |
column.HeaderText = "Order Date"; |
childTable.Columns.Add(column); |
column = new GridBoundColumn(); |
column.DataField = "Cost"; |
column.HeaderText = "Cost"; |
childTable.Columns.Add(column); |
radGrid.MasterTableView.DetailTables.Add(childTable); |
// Wire up the method that will get the grid data |
radGrid.NeedDataSource += new GridNeedDataSourceEventHandler(radGrid_NeedDataSource); |
radGrid.DetailTableDataBind += new GridDetailTableDataBindEventHandler(radGrid_DetailTableDataBind); |
// Set the key for client side selection |
radGrid.MasterTableView.ClientDataKeyNames = new string[] { "ID" }; |
// Set the key for server side selection |
radGrid.MasterTableView.DataKeyNames = new string[] { "ID" }; |
// Add the Grid to the page |
uxPlaceHolder.Controls.Add(radGrid); |
} |
protected void radGrid_NeedDataSource(object source, GridNeedDataSourceEventArgs e) |
{ |
if (!e.IsFromDetailTable) |
{ |
// Get the rad grid |
RadGrid radGrid = (RadGrid)source; |
// Bind it to the Grid |
radGrid.DataSource = this.Customers; |
// Set the count |
radGrid.VirtualItemCount = this.Customers.Count; |
} |
} |
protected void radGrid_DetailTableDataBind(object source, GridDetailTableDataBindEventArgs e) |
{ |
GridDataItem dataItem = e.DetailTableView.ParentItem; |
switch (e.DetailTableView.DataMember) |
{ |
case "CustomerID": |
List<Order> orders = GetOrdersForCustomer((int)dataItem.GetDataKeyValue("ID")); |
e.DetailTableView.DataSource = orders; |
e.DetailTableView.VirtualItemCount = orders.Count; |
break; |
default: |
break; |
} |
} |
Any thoughts or advice would be very appreciated.
Thanks,
Adam