嵌套的GridView导出为Excel,asp.net c#

我想导出父网格视图和嵌套的gridview到Excel。

我有一个代码,只能导出一个正常简单的网格视图。 试图debugging代码,发现没有任何错误或任何。

只是在我点击导出button后,它不会导出到Excel。

这是我的代码

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(); } 

这个代码是为一个正常的gridview,但不是嵌套的gridview。

我已经体验过'必须放置在一个窗体标签与runat =服务器'错误,并通过在我的页面代码隐藏添加以下重写方法解决了问题:

 public override void VerifyRenderingInServerForm(Control control) {} 

更多信息在MSDN上 。

作为参考,我也用这个代码导出我的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();