基本上,我想要做的是:
protected void Imgexport_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
//get the download page as an object (requires complex parameter)
GenericExcelDownloader Ged = new GenericExcelDownloader(gvEquipmentRuntime, "Projected Maintenance Report.xls");
//get the response stream from the download page
StringWriter sWriter = new StringWriter();
HtmlTextWriter hTextWriter = new HtmlTextWriter(sWriter);
Ged.RenderControl(hTextWriter);
//????
//Profit?
//WHAT DO?
}
我调用的控件在页面加载过程中包含代码,它基本上如此结束:(对网格进行了其他修改,添加到下面引用为“下载”的Div中)
Response.ClearContent();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment; filename=" + fileName);
Response.Charset = "";
Response.ContentType = "application/excel";
StringWriter sWriter = new StringWriter();
HtmlTextWriter hTextWriter = new HtmlTextWriter(sWriter);
Download.RenderControl(hTextWriter);//this is a Div on the page which contains the visible portion of the page control
Response.Output.Write(sWriter.ToString());
Response.Flush();
Response.End();
最终目标是,在单击按钮时,另一页面上包含在Click事件中作为初始参数传入的网格视图的修改版本的div将下载到客户端计算机上。
我被困住的地方,是我不知道如何将我的代码中的ASPX页面作为对象放到前端。我甚至不确定我的初步尝试是否是正确的起点。由于复杂的参数及其大小,我不想完全依赖window.open
字符串参数和/或会话变量......
更新:替代方法
我发现了一种可以实现目标的方法,尽管原来的问题实际上没有得到解答
通过使用Server.Execute()
我能够直接运行子页面。它还允许我访问Page.PreviousPage
属性,该属性是对调用页面的对象级引用,它包含我需要的复杂对象。然后,我可以返回引用页面以直接在子页面上获取此对象。代码看起来像这样
protected void Imgexport_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
Server.Execute("GenericExcelDownloader.aspx?Report=Projected%20Maintenance%20Report%2Exls", true);
}
在另一边
ReportName = Request.QueryString["Report"];
if (PreviousPage != null && PreviousPage is iReportPage)
ReportGrid = ((iReportPage)PreviousPage).ReportView;
现在允许页面直接处理,并处理它的响应,以便它按照我需要的方式下载网格。
已知问题:
GridView中的DataSource不会以任何持久的方式存储在Postback中,因此您必须将其保存在某个位置(Viewstate或Session),或者您必须再次从数据存储区(Es your db)请求它。 Gridview Datasource is Null During Postback
由于这个原因,我在工作结束后不久就将这整个实验提交给了我。我想避免将所有数据存储在内存中,和避免在回发期间重新生成网格。显然这是不可能的,所以我需要以更直接的方式实现这一点。
我对原始问题的答案仍然很感兴趣,我可以想象多种用途。