I've come across an issue with exporting the radgrid to csv and excel files when using the item template. I've poked around a bit on the forums to see what solutions are already present and from what I've gathered I should set the text field of my item template columns before exporting. The problem I am running into is when I try to find the control it keeps returning null (or in this case Object reference not set to an instance of an object).
My Grid Exporting Event:
The RadGrid:
The Account Id Template:
Any point in the right direction would be greatly appreciated. I'd really like to avoid having to set ExportOnlyData to false (another solution I've seen floating around) since it really ends up just not looking very nice.
My Grid Exporting Event:
protected void RadGridInventory_GridExporting(object source, GridExportingArgs e) { foreach (GridDataItem item in RadGridInventory.MasterTableView.Items) { item["AccountId"].Text = (item.FindControl("lControl") as HyperLink).Text; //returns null
item["Status"].Text = (item.FindControl("statusCode") as LiteralControl).Text; //returns null
} if (e.ExportType == ExportType.Excel) { string customText = "<h1 style='text-align:center;'>Inventory Report for " + _applicationUser.Customer.Name + "</h1>"; customText += "<p style='text-align:center;'><b>Current Date:</b> " + DateTime.Now + "<br />"; if(RadDatePickerStarting.SelectedDate != null && RadDatePickerEnding.SelectedDate != null){ customText += "<b>Date Range Covered:</b> " + RadDatePickerStarting.SelectedDate + " - " + RadDatePickerEnding.SelectedDate + "<br />"; } else { customText += "<b>Date Range Covered:</b> " + RadComboBoxChoices.SelectedItem.Text + "<br />"; } customText += "<b>Clients:</b>"; foreach (var client in ClientSelector1.SelectedClients) { customText += " " + client.Name + ","; } customText = customText.TrimEnd(','); customText += "</p>"; e.ExportOutput = e.ExportOutput.Replace("<body>", "<body>" + customText); } }The RadGrid:
public void BuildGrid(IList<UserReportColumn> userReportColumns) { RadGridInventory.FilterMenu.EnableEmbeddedSkins = false; RadGridInventory.PreRender += RadGridInventory_PreRender; RadGridInventory.EnableLinqExpressions = false; RadGridInventory.AllowFilteringByColumn = true; RadGridInventory.AllowPaging = true; RadGridInventory.AllowSorting = true; RadGridInventory.GridLines = GridLines.None; RadGridInventory.ShowGroupPanel = true; RadGridInventory.AutoGenerateColumns = false; RadGridInventory.CssClass = "RadGridAccounts"; RadGridInventory.EnableViewState = false; RadGridInventory.Width = Unit.Pixel(1090); RadGridInventory.EnableEmbeddedSkins = false; RadGridInventory.ClientSettings.AllowDragToGroup = true; RadGridInventory.ClientSettings.Resizing.AllowColumnResize = true; RadGridInventory.ClientSettings.Resizing.AllowRowResize = true; RadGridInventory.ClientSettings.Resizing.ResizeGridOnColumnResize = true; RadGridInventory.ClientSettings.Resizing.ClipCellContentOnResize = true; RadGridInventory.ClientSettings.Resizing.EnableRealTimeResize = false; RadGridInventory.ClientSettings.Resizing.ShowRowIndicatorColumn = false; RadGridInventory.PagerStyle.Mode = GridPagerMode.NextPrevAndNumeric; RadGridInventory.ExportSettings.HideStructureColumns = true; RadGridInventory.ExportSettings.ExportOnlyData = true; RadGridInventory.ExportSettings.IgnorePaging = true; RadGridInventory.MasterTableView.DataKeyNames = new string[] { "AccountId" }; RadGridInventory.MasterTableView.ClientDataKeyNames = new string[] { "AccountId" }; RadGridInventory.MasterTableView.CommandItemDisplay = GridCommandItemDisplay.Top; RadGridInventory.MasterTableView.CommandItemSettings.ShowExportToExcelButton = true; RadGridInventory.MasterTableView.CommandItemSettings.ShowExportToCsvButton = true; RadGridInventory.MasterTableView.CommandItemSettings.ShowAddNewRecordButton = false; RadGridInventory.GridExporting += new OnGridExportingEventHandler(RadGridInventory_GridExporting); RadGridInventory.MasterTableView.Width = Unit.Percentage(100); var accountColumn = userReportColumns.FirstOrDefault(x => x.ReportColumn.ColumnName == "AccountId"); if (accountColumn != null) { var templateColumn = new GridTemplateColumn(); RadGridInventory.MasterTableView.Columns.Add(templateColumn); templateColumn.ItemTemplate = new AccountColumnTemplate("AccountId"); templateColumn.DataField = "AccountId"; templateColumn.SortExpression = "AccountId"; templateColumn.UniqueName = "AccountId"; templateColumn.GroupByExpression = "Group By AccountId"; templateColumn.HeaderText = accountColumn.ColumnHeaderEval; } foreach (var column in userReportColumns) { if (column.ReportColumn.ColumnName == "AccountId") continue; if (column.ReportColumn.ColumnName == "Status") continue; var boundColumn = new GridBoundColumn(); RadGridInventory.MasterTableView.Columns.Add(boundColumn); AccountGridHelpers.SetupBoundColumn(boundColumn, column); } var statusColumn = userReportColumns.FirstOrDefault(x => x.ReportColumn.ColumnName == "Status"); if (statusColumn != null) { var statusTemplateColumn = new GridTemplateColumn(); RadGridInventory.MasterTableView.Columns.Add(statusTemplateColumn); statusTemplateColumn.ItemTemplate = new StatusColumnTemplate("Status"); statusTemplateColumn.DataField = "Status"; statusTemplateColumn.UniqueName = "Status"; statusTemplateColumn.AllowFiltering = true; statusTemplateColumn.SortExpression = "Status"; statusTemplateColumn.HeaderText = statusColumn.ColumnHeaderEval; } }The Account Id Template:
public class AccountColumnTemplate : ITemplate { protected HyperLink lControl; private string _colname; public AccountColumnTemplate(string cName) { _colname = cName; } public void InstantiateIn(System.Web.UI.Control container) { lControl = new HyperLink {ID = "lControl"}; lControl.DataBinding += lControl_DataBinding; container.Controls.Add(lControl); } public void lControl_DataBinding(object sender, EventArgs e) { var l = (HyperLink)sender; var container = (GridDataItem)l.NamingContainer; l.Attributes["href"] = "/Secure/AccountDetail.aspx?account=" + ((AccountDtoBase)container.DataItem).AccountId; l.Text = ((AccountDtoBase)container.DataItem).AccountId; } }Any point in the right direction would be greatly appreciated. I'd really like to avoid having to set ExportOnlyData to false (another solution I've seen floating around) since it really ends up just not looking very nice.