转换为Excel时从GridView中删除列

时间:2012-04-23 10:07:19

标签: c# asp.net

我有一个GridView并且在后面的代码中我将它转换为页面上按钮单击事件的Excel表格.........在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>

在Code Behind中我做的如下:

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仍然我的专栏没有在Excel表格中被删除........ 什么是错误?

1 个答案:

答案 0 :(得分:1)

  1. 如果要在导出前删除列,则需要DataBind GridView到它的DataSource。
  2. 尝试设置Viusible=false而不是删除它们
  3. 您无需创建新的服务器表单,以避免在Form外部呈现Server-Control的ASP.NET异常。

    你可以通过覆盖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. 我建议创建一个真正的excel文件,而不是只从excel解释的HTML-Table。我可以推荐EPPlus