使用复选框导出GridView时出现问题

时间:2009-11-04 03:50:16

标签: asp.net

work on asp.net vs05。我的gridview有几列,其中一些包含文字,一些包含复选框,如果我删除复选框则不会产生任何错误,如果我不删除复选框并想要以 excel或pdf 导出,那么我会收到以下错误:

  ****RegisterForEventValidation can only be called during Render();****

为什么我会收到此错误。如何解决?

我的C#代码是:

public void ToExcel()
{
    string attachment = "attachment; filename=Employee.xls";
            Response.ClearContent();
            Response.AddHeader("content-disposition", attachment);
            Response.ContentType = "application/ms-excel";
            StringWriter stw = new StringWriter();
            HtmlTextWriter htextw = new HtmlTextWriter(stw);
            gvSearch.RenderControl(htextw);
            Response.Write(stw.ToString());
            Response.End(); 
}


 public override void VerifyRenderingInServerForm(Control control)
    {

    }

昨天我发布了一个问题名称“gridview to excel”.url:http://stackoverflow.com/questions/1665958/gridview-to-excel/1669977#1669977我应用这个问题的答案,但它不起作用。帮我导出excel。

2 个答案:

答案 0 :(得分:1)

您应该尝试 Matt Bereseth GridView export utility 。它可以设法使用checkBoxes和其他HTML控件进行导出。它通过用实际值替换控件来实现这一点。

alt text
(来源:mattberseth.com

看看这个功能,它是不言自明的。您可以下载该库并自行试用。

/// <summary>
/// Replace any of the contained controls with literals
/// </summary>
/// <param name="control"></param>
private static void PrepareControlForExport(Control control)
{
    for (int i = 0; i < control.Controls.Count; i++)
    {
        Control current = control.Controls[i];
        if (current is LinkButton)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
        }
        else if (current is ImageButton)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
        }
        else if (current is HyperLink)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
        }
        else if (current is DropDownList)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
        }
        else if (current is CheckBox)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
        }

        if (current.HasControls())
        {
            GridViewExportUtil.PrepareControlForExport(current);
        }
    }
}

答案 1 :(得分:0)

将 EventValidation 设置为 false。

<%@ Page Language="C#" AutoEventWireup="true" 
CodeFile="Records.aspx.cs" Inherits="Records" 
MasterPageFile="~/Master.master"  
EnableEventValidation="false"