2011-12-22 55 views
1

我想將父網格視圖和嵌套的gridview導出到excel。嵌套的gridview導出爲ex​​cel,asp.net c#

我有一個代碼,只能導出一個正常簡單的gridview。 試圖調試代碼,發現沒有任何錯誤或任何。

這是我點擊導出按鈕後,它不會出口到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。

+0

試穿http://lakshmik.blogspot.com/2006/04/aspnet-export-to-excelword-from-nested .html n其他人。但仍然無法讓它工作。嗯? – 2011-12-22 08:10:17

+0

在調試之前,是否將htmlWriter中的任何內容寫入響應?所以在form.RenderControl(htmlWriter)之後; – 2011-12-22 10:45:05

回答

0

我所經歷的過去「必須放在一個表單標籤內有RUNAT =服務器」的錯誤,並在我的網頁代碼隱藏添加以下重寫方法解決了這個問題:

public override void VerifyRenderingInServerForm(Control control) {} 

More info on MSDN

僅供參考,我也用這個代碼導出我的GridView的:

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