I'm binding the radgrid to a object datasource
In the select method i return a populated DataTable as seen below.
The columns are created dynamically and given a specific type because i want to use the radgrid filter.
Here is the grid and objectdatasource from the aspx
The problem is that when after adding a populated datetime column in the datatable it throw's me the following error at runtime :
With any other columns i have no problem.
I'm guessing it's throwing this exception when it's adding the calendar buttons in the filterzone of the grid.
If i set the datetime column to string per example it works perfectly.
In the select method i return a populated DataTable as seen below.
The columns are created dynamically and given a specific type because i want to use the radgrid filter.
public DataTable SelectMethod(string filterExpression, string sortExpression, string strDoctype, int maximumRows, int startRowIndex){ DataTable oTable = new DataTable(); Doctype oDoctype = new Doctype(); bool bSuccess = true; Hashtable oInfo = new Hashtable(); try { oDoctype = DoctypeADO.Retrieve_byDoctypeID(strDoctype); } catch { bSuccess = false; } if (bSuccess) { oTable.Columns.Add("DocumentID", typeof(String)); oTable.Columns.Add("DoctypeID", typeof(String)); XmlDocument oDoc = new XmlDocument(); oDoc.LoadXml(oDoctype.DoctypeXML); foreach (XmlNode oNode in oDoc.DocumentElement) { oInfo.Add(oNode.Name, oNode.ChildNodes[0].InnerText); } ICollection oColl = oInfo.Keys; List<string> oBuilder = new List<string>(); foreach (string strkey in oColl) { string type = string.Empty; switch (oInfo[strkey].ToString()) { case "Boolean": { type = "Bit"; oTable.Columns.Add(strkey, typeof(Boolean)); break; } case "Byte": { type = "smallint"; oTable.Columns.Add(strkey, typeof(Byte)); break; } case "DateTime": { type = "datetime"; oTable.Columns.Add(strkey, typeof(DateTime)); break; } case "Double": { type = "decimal"; oTable.Columns.Add(strkey, typeof(Double)); break; } case "Int16": { type = "smallint"; oTable.Columns.Add(strkey, typeof(Int16)); break; } case "Int32": { type = "int"; oTable.Columns.Add(strkey, typeof(Int32)); break; } case "Single": { type = "decimal"; oTable.Columns.Add(strkey, typeof(Single)); break; } case "String": { type = "varchar(100)"; oTable.Columns.Add(strkey, typeof(String)); break; } default: { break; } } oBuilder.Add("document_xml.value('(//Fields/" + strkey + "/Value)[1]','" + type + "') as " + strkey); } string strQuery = @"select document_id as DocumentID, doctype_id as DoctypeID, " + String.Join(",", oBuilder.ToArray()) + @" from ( select row_number() over (order by document_id asc) as rownumber, * from cs_document where doctype_id = @doc_id ) as test where ROWNUMBER between @nStart+1 and @nEnd"; strQuery = AddFilter_Sorting(strQuery, filterExpression, sortExpression); oCommand = new SqlCommand(strQuery); oCommand.Parameters.Add( new SqlParameter { DbType = DbType.String, ParameterName = "doc_id", Value = strDoctype }); oCommand.Parameters.Add( new SqlParameter { DbType = DbType.Int32, ParameterName = "nStart", Value = startRowIndex }); oCommand.Parameters.Add( new SqlParameter { DbType = DbType.Int32, ParameterName = "nEnd", Value = startRowIndex + maximumRows }); oCommand.Connection = oConnection; try { oConnection.Open(); oReader = oCommand.ExecuteReader(); while (oReader.Read()) { object[] data = new object[oTable.Columns.Count]; for (int i = 0; i < oTable.Columns.Count; i++) { data[i] = oReader[oTable.Columns[i].ColumnName]; } DataRow oRow = oTable.NewRow(); oRow.ItemArray = data; oTable.Rows.Add(oRow); } } catch (Exception ex) { throw ex; } } return oTable;}
protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
e.InputParameters["filterExpression"] = RadGrid1.MasterTableView.FilterExpression;
e.InputParameters["sortExpression"] = RadGrid1.MasterTableView.SortExpressions.GetSortString();
} Here is the grid and objectdatasource from the aspx
<telerik:RadGrid ID="RadGrid1" runat="server" Width="100%" GridLines="None" AllowPaging="true" AutoGenerateColumns="true" AllowFilteringByColumn="false" PageSize="10" AllowSorting="true" Skin="Outlook" DataSourceID="ObjectDataSource1"> <MasterTableView AllowCustomSorting="true" OverrideDataSourceControlSorting="true"> <CommandItemSettings ExportToPdfText="Export to Pdf"></CommandItemSettings> <Columns> <telerik:GridTemplateColumn UniqueName="Uniq" HeaderText="Check" AllowFiltering="False"> <ItemTemplate> <asp:CheckBox ID="check" runat="server" /> </ItemTemplate> </telerik:GridTemplateColumn> </Columns> <HeaderStyle VerticalAlign="Middle" /> <ItemStyle VerticalAlign="Middle" /> <FilterItemStyle VerticalAlign="Middle" /> </MasterTableView> </telerik:RadGrid> <asp:ObjectDataSource ID="ObjectDataSource1" TypeName="WebApplication1.DatabaseHandle.ObjectSource" EnablePaging="true" SelectMethod="SelectMethod" SelectCountMethod="MySelectCount" runat="server" OnSelecting="ObjectDataSource1_Selecting"> <SelectParameters> <asp:Parameter Name="filterExpression" Type="String" /> <asp:Parameter Name="sortExpression" Type="String" /> <asp:ControlParameter ControlID="hidden_doctype" DbType="String" PropertyName="Value" Name="strDoctype" /> </SelectParameters> </asp:ObjectDataSource>The problem is that when after adding a populated datetime column in the datatable it throw's me the following error at runtime :
With any other columns i have no problem.
I'm guessing it's throwing this exception when it's adding the calendar buttons in the filterzone of the grid.
The control collection cannot be modified during DataBind, Init, Load, PreRender or Unload phases.Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.Exception Details: System.Web.HttpException: The control collection cannot be modified during DataBind, Init, Load, PreRender or Unload phases.Source Error:An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.Stack Trace:[HttpException (0x80004005): The control collection cannot be modified during DataBind, Init, Load, PreRender or Unload phases.] System.Web.UI.ControlCollection.Add(Control child) +8680983 Telerik.Web.UI.GridDateTimeColumn.GetSharedCalendar() +192 Telerik.Web.UI.GridDateTimeColumn.SetupFilterControls(TableCell cell) +2169 Telerik.Web.UI.GridColumn.InitializeCell(TableCell cell, Int32 columnIndex, GridItem inItem) +5498 Telerik.Web.UI.GridBoundColumn.InitializeCell(TableCell cell, Int32 columnIndex, GridItem inItem) +50 Telerik.Web.UI.GridItem.Initialize(GridColumn[] columns) +142 Telerik.Web.UI.GridItem.SetupItem(Boolean dataBind, Object dataItem, GridColumn[] columns, ControlCollection rows) +939 Telerik.Web.UI.GridTableView.CreateFilteringItem(Boolean useDataSource, GridColumn[] copiedColumnSet, GridTHead thead) +146 Telerik.Web.UI.GridTableView.CreateControlHierarchy(Boolean useDataSource) +1495 Telerik.Web.UI.GridTableView.CreateChildControls(IEnumerable dataSource, Boolean useDataSource) +777 System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) +57 System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) +114 System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +31 System.Web.UI.WebControls.DataBoundControl.PerformSelect() +142 Telerik.Web.UI.GridTableView.PerformSelect() +38 System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +73 Telerik.Web.UI.GridTableView.DataBind() +351 System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82 System.Web.UI.WebControls.BaseDataBoundControl.OnPreRender(EventArgs e) +22 Telerik.Web.UI.GridTableView.OnPreRender(EventArgs e) +57 System.Web.UI.Control.PreRenderRecursiveInternal() +80 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842If i set the datetime column to string per example it works perfectly.