即使form具有runat = server,也将Gridview内容导出为ex​​cel,形成runat = server错误

时间:2012-05-02 08:04:09

标签: c# asp.net datagridview updatepanel

好的,情况就是这样。

我将Gridview内容导出到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”,为什么会这样呢?

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

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

每次我在txtClientName

中输入一个值时,这基本上只会触发我的更新面板

我不确定这会导致这样的错误。如果有人能够对此有所了解或指导我朝着正确的方向前进,我会很高兴。这是因为我的gridview放在更新面板中吗? arghhhh ..

提前致谢!

编辑:确定第一个问题已经解决......但是出现了一个新问题。

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

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: 好的问题大多解决了。通过在@ Page部分输入EnableEventValidation =“false”,这可以正常运行。但是,现在这有什么不安全吗?

编辑3: 另外,有没有办法实现这一点而不会丢失microsoft excel中的单元格边框?

1 个答案:

答案 0 :(得分:1)

我知道这并不能直接解决你的渲染问题,但如果你的数据网格绑定到数据集,为什么不使用像这个问题中接受的anser这样的方法直接从数据集中导出它:

Export DataTable to Excel File

更新

如果您没有数据集,可以使用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");