将 Gridview 内容导出到 Excel 窗体运行时=服务器错误,即使窗体具有 runat=服务器也是如此

本文关键字:窗体 服务器 runat 错误 Excel Gridview 运行时 | 更新日期: 2023-09-27 18:32:49

好的,这就是情况。

我已将网格视图内容导出到 Excel 工作表。基本上我有一个调用方法的按钮(例如btnExcel_Clicked(。背后的 c# 代码是这样的

protected void btnExcel_Click ( object sender, EventArgs e )
{
    Response.Clear( );
    Response.AddHeader( "content-disposition", "attachment; filename=" + "test" + "_Registration_Forms.xls" );
    Response.Charset = "";
    Response.ContentType = "application/vnd.ms-excel";
    Page.EnableViewState = false;
    System.IO.StringWriter stringWrite = new System.IO.StringWriter( );
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter( stringWrite );
    clientGridView.RenderControl( htmlWrite ); //this is the name of my gridview
    Response.Write( stringWrite.ToString( ) );
    Response.End( );
}

当按钮触发时,它会显示错误:

"System.Web.HttpException:类型为'GridView'的控件'clientGridView'必须放置在带有runat=server的表单标记中。

指示以下代码是发生错误的位置:

Line 217:        clientGridView.RenderControl( htmlWrite );

如果我的表单确实包含 runat="server",为什么会这样?

怀疑这可能是由于我如何使用页面,网格视图被包装在更新面板中(不确定这是否会导致任何问题?(,并且我在页面顶部有一些javascript允许页面刷新每个搜索查询。看起来像这样:

<script type="text/javascript">
    function RefreshUpdatePanel() {
        __doPostBack('<%= txtClientName.ClientID %>', '');
        $('#totals').fadeIn('slow');
        $('#clientGrid').fadeIn('slow');
        $('#btnReport').fadeIn('slow');
    };
</script>

这基本上只是每次我在 txtClientName 中输入值时都会触发我的更新面板

我不确定这如何导致这样的错误。如果有人能对此有所了解或引导我朝着正确的方向前进,我会很棒。这是因为我的网格视图放置在更新面板中吗?啊

啊。。。

提前感谢!

编辑:好的第一个问题解决了...但是一个新的问题出现了。

通过将此代码放在我的代码后面:

public override void VerifyRenderingInServerForm ( System.Web.UI.Control control )
{
    //confirms that an HtmlForm control is rendered for the
    //specified ASP.NET server control at run time.
}

我可以克服该错误,但是出现了一个新错误:

System.InvalidOperationException: RegisterForEventValidation can only be called during     Render();

呸。

编辑 2:好的问题基本解决了。通过在@页面部分中输入EnableEventValidation ="false",这将正常工作。但是,现在不安全吗,有没有办法解决这个问题?

编辑3:另外,有没有办法在不丢失微软Excel中的单元格边框的情况下实现这一目标?

将 Gridview 内容导出到 Excel 窗体运行时=服务器错误,即使窗体具有 runat=服务器也是如此

我知道这不会直接解决您的渲染问题,但是如果您的 datagrid 绑定到数据集,为什么不使用诸如此问题中接受的 anser 之类的方法直接从数据集导出它:

将数据表导出到 Excel 文件

更新

如果您没有数据集,则可以使用 SQLDataAdapter 轻松生成一个数据集,并按如下所示填充数据集:

var dataAdapter = new SqlDataAdapter("Select * From table",
 "Data Source=MySQLServerName;Initial Catalog=DatabaseName;Integrated Security=True");
        var dataset = new DataSet();
        dataAdapter.Fill(dataset);

更新 2

如果要使用数据源中的 sqlcommand 文本,可以执行以下操作:

var dataAdapter = new SqlDataAdapter(mySqlDatasource.SelectCommand,
     "Data Source=MySQLServerName;Initial Catalog=DatabaseName;Integrated Security=True");