2009-09-11 31 views
0

我收到以下錯誤寫的GridView到Excel

Error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled. 

我想把Excel中的網格的onclick

Sub bttntxtfile_Click(ByVal sender As Object, ByVal e As EventArgs) 
    GridViewExportUtil.Export("Customers.xls", GridView1) 
End Sub 

public class GridViewExportUtil 
{ 

public static void Export(string fileName, GridView gv) 
{ 
    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.AddHeader(
     "content-disposition", string.Format("attachment; filename={0}", fileName)); 
    HttpContext.Current.Response.ContentType = "application/ms-excel"; 

    using (StringWriter sw = new StringWriter()) 
    { 
     using (HtmlTextWriter htw = new HtmlTextWriter(sw)) 
     { 
      // Create a form to contain the grid 
      Table table = new Table(); 

      // add the header row to the table 
      if (gv.HeaderRow != null) 
      { 
       GridViewExportUtil.PrepareControlForExport(gv.HeaderRow); 
       table.Rows.Add(gv.HeaderRow); 
      } 

      // add each of the data rows to the table 
      foreach (GridViewRow row in gv.Rows) 
      { 
       GridViewExportUtil.PrepareControlForExport(row); 
       table.Rows.Add(row); 
      } 

      // add the footer row to the table 
      if (gv.FooterRow != null) 
      { 
       GridViewExportUtil.PrepareControlForExport(gv.FooterRow); 
       table.Rows.Add(gv.FooterRow); 
      } 

      // render the table into the htmlwriter 
      table.RenderControl(htw); 

      // render the htmlwriter into the response 
      HttpContext.Current.Response.Write(sw.ToString()); 

     } 
    } 
} 

/// <summary> 
/// Replace any of the contained controls with literals 
/// </summary> 
/// <param name="control"></param> 
private static void PrepareControlForExport(Control control) 
{ 
    for (int i = 0; i < control.Controls.Count; i++) 
    { 
     Control current = control.Controls[i]; 
     if (current is LinkButton) 
     { 
      control.Controls.Remove(current); 
      control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text)); 
     } 
     else if (current is ImageButton) 
     { 
      control.Controls.Remove(current); 
      control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText)); 
     } 
     else if (current is HyperLink) 
     { 
      control.Controls.Remove(current); 
      control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text)); 
     } 
     else if (current is DropDownList) 
     { 
      control.Controls.Remove(current); 
      control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text)); 
     } 
     else if (current is CheckBox) 
     { 
      control.Controls.Remove(current); 
      control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False")); 
     } 

     if (current.HasControls()) 
     { 
      GridViewExportUtil.PrepareControlForExport(current); 
     } 
    } 
} 
} 

我有兩個response.redirects但我評論他們出來,我仍然有錯誤。有沒有人曾經見過這個錯誤?難道我做錯了什麼?

我覺得它有什麼做的httpcontext.current.response.clear和httpContext.current.response.addheader線

回答

1

的「PageRequestManagerParserError如果您的「導出到Excel」按鈕位於更新面板內部,則可能由調用Response.Write()導致異常。從更新面板中刪除按鈕或使用PostBackTrigger

請參閱this文章以獲取更多信息。

+0

謝謝。這是一個我在任何地方找不到的簡單答案。 +1並接受答案 – Eric 2009-09-14 14:08:41

0

這應該幫助..

它更多的是讀/寫數據到Excel,比專門從一個gridview,但任何.NET程序員應該能夠做到這一點..

http://support.microsoft.com/kb/316934#10

+0

是的。這是我的下一個選擇,如果我無法弄清楚這個錯誤。我認爲不同之處在於我將網格直接複製到Excel中,而不是將文本寫入Excel表格。 – Eric 2009-09-11 19:56:04