0

I have a GridView And in a Code Behind i am converting it into Excel Sheet on a Button Click Event in the page.........The Code is as follows in aspx.

<form id="form1" runat="server">
    <table width="1100" border="0" cellpadding="0" cellspacing="0" style="height:100%; background-color:White" align="center">
            <tr><td>&nbsp;</td></tr>
            <tr>
                <td align="center">
                    <asp:Button ID="DividendEportToExcel" runat="server" Text="Convert To Excel" 
                        CssClass="bluesome" onclick="DividendEportToExcel_Click" />      
                </td>
            </tr>
            <tr>
                <td>
                     <asp:GridView ID="MemberDividendView" runat="server">
                               </asp:GridView>
               </td>
           </tr>
     </table>
</form>

And in the Code Behind I am doing as follows :

protected void DividendEportToExcel_Click(object sender, EventArgs e)
    {
        MemberDividendView.Columns.RemoveAt(5);
        MemberDividendView.ShowHeader = true;
        MemberDividendView.GridLines = GridLines.Both;
        MemberDividendView.PagerSettings.Visible = false;
        MemberDividendView.DataBind();
        ChangeControlsToValue(MemberDividendView);
        Response.ClearContent();
        Response.AddHeader("content-disposition", "attachment; filename=AdjustmentDetialsToExcel.xls");
        Response.ContentType = "application/excel";
        StringWriter sWriter = new StringWriter();
        HtmlTextWriter hTextWriter = new HtmlTextWriter(sWriter);
        HtmlForm hForm = new HtmlForm();
        MemberDividendView.Parent.Controls.Add(hForm);
        hForm.Attributes["runat"] = "server";
        hForm.Controls.Add(MemberDividendView);
        hForm.RenderControl(hTextWriter);
        Response.Write(sWriter.ToString());
        Response.End();
      }

    private void ChangeControlsToValue(Control gridView)
    {
        Literal literal = new Literal();

        for (int i = 0; i < gridView.Controls.Count; i++)
        {
            if (gridView.Controls[i].GetType() == typeof(LinkButton))
            {

                literal.Text = (gridView.Controls[i] as LinkButton).Text;
                gridView.Controls.Remove(gridView.Controls[i]);
                //gridView.Controls.AddAt(i,literal);
            }
            else if (gridView.Controls[i].GetType() == typeof(DropDownList))
            {
                literal.Text = (gridView.Controls[i] as DropDownList).SelectedItem.Text;
                gridView.Controls.Remove(gridView.Controls[i]);
                //gridView.Controls.AddAt(i,literal);
            }
            else if (gridView.Controls[i].GetType() == typeof(CheckBox))
            {
                literal.Text = (gridView.Controls[i] as CheckBox).Checked ? "True" : "False";
                gridView.Controls.Remove(gridView.Controls[i]);
                //gridView.Controls.AddAt(i,literal);
            }
            if (gridView.Controls[i].HasControls())
            {
                ChangeControlsToValue(gridView.Controls[i]);

            }
        }
    }

BUt still my column is not being deleted in the Excel Sheet........ What is the error ??

1 Answers1

1
  1. You need to DataBind the GridView to it's DataSource when you want to remove columns before export.
  2. Try to set them Viusible=false instead of removing them
  3. You don't need to create a new server form to avoid the ASP.NET exception that a Server-Control was rendered outside of a Form.

    You could avoid this execption by overriding VerifyRenderingInServerForm

    public override void VerifyRenderingInServerForm(Control control)
    {
      /* Confirms that an HtmlForm control is rendered for the specified ASP.NET
         server control at run time. */
    }
    
  4. I would recommend to create a real excel file instead of a HTML-Table that is just interpreted from excel. I can recommend EPPlus.

Tim Schmelter
  • 450,073
  • 74
  • 686
  • 939