This is a migrated thread and some comments may be shown as answers.

RadGrid - Export to CSV unable to set custom headers

5 Answers 245 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Roelf
Top achievements
Rank 1
Roelf asked on 25 Oct 2016, 08:13 AM

Hi

We are using a 2 language system and set the headers of the RadGrid according to the user's selected language and works fine for display. The RadGrid should be able to export to Excel and CSV. The excel exports the headers correctly, but the CSV only uses default column names set in the ASPX file. We are using version 2015.2.729. Here is an abbreviated version of our code:

<telerik:RadGrid ID="grdBlocked" runat="server" AutoGenerateColumns="False" OnItemDataBound="grdBlocked_ItemDataBound" OnNeedDataSource="grdBlocked_NeedDataSource" OnInfrastructureExporting="grdBlocked_InfrastructureExporting" OnGridExporting="grdBlocked_GridExporting" OnItemCommand="grdBlocked_ItemCommand">
                    <ExportSettings ExportOnlyData="True" IgnorePaging="true">
                        <Excel Format="Xlsx" FileExtension=".xlsx" />
                    </ExportSettings>
                    <MasterTableView DataKeyNames="StudentNumber, DateBlocked" CommandItemDisplay="Top">
                        <CommandItemSettings ExportToPdfText="Export to PDF" ShowAddNewRecordButton="False" ShowExportToCsvButton="True" ShowExportToExcelButton="True" ShowExportToPdfButton="False" ShowExportToWordButton="False" ShowRefreshButton="False"></CommandItemSettings>
                        <Columns>
                            <telerik:GridBoundColumn DataField="StudentNumber" HeaderText="Student number" UniqueName="StudentNumber"></telerik:GridBoundColumn>
                            <telerik:GridBoundColumn DataField="Name" HeaderText="Student Name" UniqueName="Name"></telerik:GridBoundColumn>
                            <telerik:GridBoundColumn DataField="DateBlocked" HeaderText="Date" UniqueName="Date" DataType="System.DateTime" DataFormatString="{0:yyyy/MM/dd HH:mm}"></telerik:GridBoundColumn>
                            <telerik:GridBoundColumn DataField="BlockedUser" HeaderText="User" UniqueName="User"></telerik:GridBoundColumn>
                        </Columns>
                    </MasterTableView>
                </telerik:RadGrid>

 

Code behind (read comments):

using System;
using System.Web.UI;
using Telerik.Web.UI;
 
namespace WritingCentreOnlineBookings.Reports
{
    public partial class BlockedAccounts : System.Web.UI.Page
    {
        private Includes.Site masterPage = new Includes.Site();
        private WebAPICalls MyWebAPI = new WebAPICalls();
 
        protected void BindData()
        {
            grdBlocked.DataSource = MyWebAPI.GetDataTable("GetBlockedStudents");
            grdBlocked.DataBind();
        }
 
        protected void grdBlocked_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
        {
            if (e.Item.ItemType == GridItemType.Header)
            {
                GridHeaderItem header = (GridHeaderItem)e.Item;
                header["StudentNumber"].Text = (masterPage.LanguageCode == "afr" ? "Studentenommer" : "Student number");
                header["Name"].Text = (masterPage.LanguageCode == "afr" ? "Naam van student" : "Student name");
                header["Date"].Text = (masterPage.LanguageCode == "afr" ? "Datum" : "Date");
                header["User"].Text = (masterPage.LanguageCode == "afr" ? "Geblok deur" : "Blocked by");
            }
        }
 
        protected void Page_Load(object sender, EventArgs e)
        {
            masterPage = (Includes.Site)Master;
 
            if (!Page.IsPostBack)
            {
                BindData();
            }
        }
 
        protected void grdBlocked_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
        {
            grdBlocked.DataSource = MyWebAPI.GetDataTable("GetBlockedStudents");
        }
 
        //Tried to change the column headers here, but it never gets called for CSV, only for excel
        protected void grdBlocked_InfrastructureExporting(object sender, GridInfrastructureExportingEventArgs e)
        {
            for (int i = 2; i <= e.ExportStructure.Tables[0].Rows.Count; i++)
            {
                var cell = e.ExportStructure.Tables[0].Cells[1, i];
                //Forces the student number to be text in Excel
                cell.Format = "@";
                cell = e.ExportStructure.Tables[0].Cells[3, i];
                cell.Value = ((DateTime)cell.Value).ToString("yyyy-MM-dd HH:mm");
            }
        }
 
        //Documentation suggests this is the place to add customization. It gets called, but does not seem to have an effect
        protected void grdBlocked_GridExporting(object sender, GridExportingArgs e)
        {
            GridItem[] headerItems = grdBlocked.MasterTableView.GetItems(GridItemType.Header);
            headerItems[0].Cells[2].Text = (masterPage.LanguageCode == "afr" ? "Studentenommer" : "Student number");
        }
 
        //Also tried to rebind, just to make sure the column headers are loaded
        protected void grdBlocked_ItemCommand(object sender, GridCommandEventArgs e)
        {
            if (e.CommandName == RadGrid.ExportToCsvCommandName)
            {
                grdBlocked.Rebind();
            }
        }
    }
}

5 Answers, 1 is accepted

Sort by
0
Accepted
Kostadin
Telerik team
answered on 28 Oct 2016, 09:05 AM
Hello Roelf,

A possible solution is to change the column names on PreRender event handler and call rebind. Please check out the following code snippet.
protected void grdBlocked_PreRender(object sender, EventArgs e)
{
    grdBlocked.MasterTableView.GetColumn("StudentNumber").HeaderText = "Studentenommer";
    grdBlocked.MasterTableView.GetColumn("Name").HeaderText = "Naam van student";
    grdBlocked.MasterTableView.GetColumn("Date").HeaderText = "Datum";
    grdBlocked.MasterTableView.GetColumn("User").HeaderText = "Geblok deur";
    grdBlocked.Rebind();
}

You can use a boolean variable to distinguish whether the export command is fired if you do not want to execute this logic on each postback.

Regards,
Kostadin
Telerik by Progress
Check out the new UI for ASP.NET Core, the most complete UI suite for ASP.NET Core development on the market, with 60+ tried-and-tested widgets, based on Kendo UI.
0
Roelf
Top achievements
Rank 1
answered on 04 Nov 2016, 01:17 PM
This is a workable solution. Thank you
0
MBEN
Top achievements
Rank 2
Veteran
answered on 27 Sep 2018, 04:29 PM

I am having the same issue. Unfortunately, rebind does not work for me. And if I rebind the grid, it removes the custom headers from pdf and excel as well, which seem to be exporting fine without the rebind.

My prerender code below:

protected void grid_PreRender(object source, EventArgs e)
    {
        RadGrid grid = (RadGrid)source; 
        foreach (GridHeaderItem headerItem in grid.MasterTableView.GetItems(GridItemType.Header))
        {
            string annualYearHeader = (Convert.ToDateTime(FiscalEnd).Month == 12) ? PlanYear.ToString() : (PlanYear - 1).ToString() + " - " + PlanYear.ToString();
            string projectedYearHeader = (Convert.ToDateTime(FiscalEnd).Month == 12) ? (PlanYear + 1).ToString() : PlanYear.ToString() + " - " + (PlanYear + 1).ToString();
            headerItem["PriorYearAccountBalance"].Text = Convert.ToDateTime(FiscalEnd + "/" + PlanYear).AddYears(-1).ToShortDateString() + " Account Balance ($)";
            headerItem["PlanExpense"].Text = annualYearHeader + "  Plan Expense ($)";
            headerItem["BenefitPayments"].Text = annualYearHeader + "  Benefit Payments ($)";
            headerItem["AccountBalance"].Text = FiscalEnd + "/" + PlanYear + " Account Balance ($)";
            headerItem["NextYearPlanExpense"].Text = "Projected " + projectedYearHeader + "  Plan Expense ($)";
            headerItem["NextYearBenefitPayments"].Text = "Projected " + projectedYearHeader + "  Benefit Payments ($)";
            headerItem["NextYearAccountBalance"].Text = "Projected " + Convert.ToDateTime(FiscalEnd + "/" + PlanYear).AddYears(1).ToShortDateString() + " Account Balance ($)";
        } 
        base.ExportTitle = "<b>" + Profile.ClientName + "</b><br />" + PlanName + "<br />Benefit Accounting";
        base.ExportExhibitName = PlanName + " - Benefit Accounting";
        base.grid_PreRender(source, e);
    }
Base PreRender event
protected virtual void grid_PreRender(object source, EventArgs e)
        {
            RadGrid grid = (RadGrid)source;
            if (grid.MasterTableView.Items.Count == 0)
            {
                grid.ShowFooter = false;
            }      
 
            RadAjaxManager.GetCurrent(Page).ClientEvents.OnRequestStart = "RequestStart";
        }
0
Tsvetomir
Telerik team
answered on 02 Oct 2018, 10:41 AM
Hello,

Alternating the header text when exporting to Excel and PDF should as expected by default. Generally, the header columns' text is modified in the PreRender() event handler. In other words, the changes are applicable to every export type. However, what could be done is to isolate and modify the headers only when exporting to CSV. In the example where I have tested it out, I took advantage of the CommandItem menu and enabled the export to CSV functionality. Afterward, subscribe to the ItemCommand event and apply the following condition:

protected void RadGrid1_ItemCommand(object sender, GridCommandEventArgs e)
{
    if (e.CommandName == Telerik.Web.UI.RadGrid.ExportToCsvCommandName)
    {
        RadGrid1.MasterTableView.GetColumn("ColumnName").HeaderText = "NewText";
    }
}

Take a look at the provided resources and let me know if you have additional questions about adapting them to your scenario.

Kind regards,
Tsvetomir
Progress Telerik
Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
0
MBEN
Top achievements
Rank 2
Veteran
answered on 03 Oct 2018, 04:13 PM
Thanks, That worked.
Tags
Grid
Asked by
Roelf
Top achievements
Rank 1
Answers by
Kostadin
Telerik team
Roelf
Top achievements
Rank 1
MBEN
Top achievements
Rank 2
Veteran
Tsvetomir
Telerik team
Share this question
or