简体   繁体   English

嵌套的GridView导出到Excel,asp.net C#

[英]nested gridview export to excel, asp.net c#

I want to export the parent grid view and nested gridview to an excel. 我想将父网格视图和嵌套的网格视图导出到Excel。

I have a code that only work to export a normal simple gridview. 我有一个代码只能导出普通的简单gridview。 Tried to debug the code, found there is no error or whatsoever. 尝试调试代码,发现没有错误或任何错误。

It is just after i click the export button, it doesnt export to excel. 它只是在我单击导出按钮后,它不会导出到excel。

here is my code 这是我的代码

 protected void asd()
{

    string title = "";
    string attempt = "SELECT * FROM Poll Where PollID = '" + Session["abc"] + "'";

    cmd = new SqlCommand(attempt, con);
    dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        title = dr["PollTitle"].ToString();
    }

    string filename = String.Format(title + " RESULTS. " + "{0}_{1}.xls",
 DateTime.Today.Month.ToString(), DateTime.Today.Year.ToString());

    Response.Clear();
    Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
    Response.Charset = "";

    // SetCacheability doesn't seem to make a difference (see update)
    Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

    Response.ContentType = "application/vnd.xls";

    System.IO.StringWriter stringWriter = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);

    // Replace all gridview controls with literals
    ClearControls(GridView3);

    // Throws exception: Control 'ComputerGrid' of type 'GridView'
    // must be placed inside a form tag with runat=server.
    // ComputerGrid.RenderControl(htmlWrite);

    // Alternate to ComputerGrid.RenderControl above
    System.Web.UI.HtmlControls.HtmlForm form
        = new System.Web.UI.HtmlControls.HtmlForm();
    Controls.Add(form);
    form.Controls.Add(GridView3);
    form.RenderControl(htmlWriter);

    Response.Write(stringWriter.ToString());
    Response.End();
}

private void ClearControls(Control control)
{
    for (int i = control.Controls.Count - 1; i >= 0; i--)
    {
        ClearControls(control.Controls[i]);
    }

    if (!(control is TableCell))
    {
        if (control.GetType().GetProperty("SelectedItem") != null)
        {
            LiteralControl literal = new LiteralControl();
            control.Parent.Controls.Add(literal);
            try
            {
                literal.Text =
                    (string)control.GetType().GetProperty("SelectedItem").
                        GetValue(control, null);
            }
            catch
            { }
            control.Parent.Controls.Remove(control);
        }
        else if (control.GetType().GetProperty("Text") != null)
        {
            LiteralControl literal = new LiteralControl();
            control.Parent.Controls.Add(literal);
            literal.Text =
                (string)control.GetType().GetProperty("Text").
                    GetValue(control, null);
            control.Parent.Controls.Remove(control);
        }
    }
    return;

}
protected void Export_buttonClick(object sender, EventArgs e)
{
    asd();
}

this code is working for a normal gridview, but not the one with nested gridview. 这段代码适用于普通的gridview,但不适用于嵌套的gridview。

I've experienced the 'must be placed inside a form tag with runat=server' error in the past and resolved the issue by adding the following override method in my page codebehind: 我过去遇到过“必须放在带有runat = server的表单标记中”错误,并通过在我的页面代码后面添加以下重写方法解决了该问题:

public override void VerifyRenderingInServerForm(Control control) {}

More info on MSDN . 有关MSDN的更多信息

For reference, I also used this code for exporting my GridViews: 作为参考,我还使用以下代码导出了GridViews:

Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=your_file.xls");
Response.Charset = "";
Response.ContentEncoding = System.Text.Encoding.Default;
Response.ContentType = "application/ms-excel";

StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
your_GridView.RenderControl(hw);

Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM