创建新页面作为控件并在弹出窗口中显示

时间:2016-05-23 18:41:04

标签: c# asp.net

基本上,我想要做的是:

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

由于这个原因,我在工作结束后不久就将这整个实验提交给了我。我想避免将所有数据存储在内存中,避免在回发期间重新生成网格。显然这是不可能的,所以我需要以更直接的方式实现这一点。

我对原始问题的答案仍然很感兴趣,我可以想象多种用途。

0 个答案:

没有答案