2012-05-02 55 views
0

好吧,這就是情況。將Gridview內容導出爲ex​​cel形式runat =服務器錯誤,即使表單有runat =服務器

我有Gridview內容被導出到Excel工作表。基本上我有一個調用方法的按鈕(例如btnExcel_Clicked)。 C#代碼是背後這樣

protected void btnExcel_Click (object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.AddHeader("content-disposition", "attachment; filename=" + "test" + "_Registration_Forms.xls"); 
    Response.Charset = ""; 
    Response.ContentType = "application/vnd.ms-excel"; 
    Page.EnableViewState = false; 

    System.IO.StringWriter stringWrite = new System.IO.StringWriter(); 
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); 

    clientGridView.RenderControl(htmlWrite); //this is the name of my gridview 

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

當按鈕火災,它然後顯示該錯誤:

「System.Web.HttpException:類型的控制‘clientGridView’‘的GridView’必須被放在裏面runat = server的表單標籤。「

表明下面的代碼是哪裏出現了錯誤:

Line 217:  clientGridView.RenderControl(htmlWrite); 

爲什麼會變成這樣,如果我的形式確實有RUNAT =「服務器」裏呢?

我懷疑它可能是我如何使用頁面的結果,GridView包裝在更新面板(不知道這是否會導致任何問題?),我有一些JavaScript在頁面的頂部允許頁面刷新每個搜索查詢。它看起來像這樣:

<script type="text/javascript"> 
    function RefreshUpdatePanel() { 
     __doPostBack('<%= txtClientName.ClientID %>', ''); 
     $('#totals').fadeIn('slow'); 
     $('#clientGrid').fadeIn('slow'); 
     $('#btnReport').fadeIn('slow'); 
    }; 
</script> 

這基本上只是激發我的更新面板每次我輸入一個值txtClientName

我不知道如何任何這將導致這樣的錯誤。如果有人能夠闡明這一點,或者指引我朝着正確的方向發展,我會非常感激。這是因爲我的gridview被放置在更新面板中? arghhhh ..

在此先感謝!

編輯:確定第一個問題解決了......但出現了一個新問題。

通過將該代碼在我後面的代碼:

public override void VerifyRenderingInServerForm (System.Web.UI.Control control) 
{ 
    //confirms that an HtmlForm control is rendered for the 
    //specified ASP.NET server control at run time. 
} 

能讓我過去的錯誤,但是一個新的錯誤出現了:

System.InvalidOperationException: RegisterForEventValidation can only be called during  Render(); 

呸。

編輯2: 好的問題大多解決了。通過在@ Page部分中輸入EnableEventValidation =「false」,此功能可以正常工作。然而,現在這是不安全的有沒有辦法解決這個問題?

編輯3: 此外,有沒有一種方法可以實現這一點,而不會丟失在Microsoft Excel中的單元格邊框?

回答

1

我知道這並不直接豆你的渲染問題,但如果你的DataGrid綁定到數據集,爲什麼不直接從數據集中使用的方法導出,如在這個問題上接受雁:

Export DataTable to Excel File

更新

如果你沒有一個數據集,你可以很容易地使用的SqlDataAdapter生成一個和填補像這樣的數據集:

var dataAdapter = new SqlDataAdapter("Select * From table", 
"Data Source=MySQLServerName;Initial Catalog=DatabaseName;Integrated Security=True"); 

     var dataset = new DataSet(); 

     dataAdapter.Fill(dataset); 

更新2

如果您想使用您的數據源的SqlCommand的文字,你可以這樣做:

var dataAdapter = new SqlDataAdapter(mySqlDatasource.SelectCommand, 
    "Data Source=MySQLServerName;Initial Catalog=DatabaseName;Integrated Security=True"); 
+0

我不是很懂行的這個(綁定到數據集)。我有一個網格視圖,它需要一個sqldatasource並使用它來填充gridview中的單元格。我不必以任何方式創建數據集,並且在查看此示例時,我不確定'dt'的來源。我假設city.getAllCity()是一個自定義的方法。我不知道如何解決這個問題。然而,如果你不介意去掉一些光線,我完全不會介意瞭解這個過程以及這裏實際發生的事情。 – zillaofthegods

+0

數據集生成的更新示例# – Richard

+0

非常好!感謝您的指導。我可以將我的sqldatasource插入SqlDataAdapter嗎?我根據用戶輸入的內容生成大量查詢,因此我無法僅使用靜態SQL查詢/非查詢。 – zillaofthegods