2012-02-04 287 views
1

我有從GridView導出數據到csv的代碼。它適用於其他網站,但不適用於我正在開發的最新版本。導出的CSV文件爲空

GridView綁定在後面的代碼中的DataTable。以下是綁定提取並將數據綁定到GridView的事件。

private void bindGridView() 
    { 
     //Fetching data from DB goes here 

     myTable.Columns.Add("type", typeof(int)); 
     myTable.Columns.Add("rate", typeof(int)); 

     foreach (DataRow rows in myTable.Rows) 
     { 
      if (rows["dst"].ToString() == "1875") 
      { 
       rows["type"] = 1; 
       rows["rate"] = 500; 
       rows.AcceptChanges(); 
      } 
      else if (rows["dst"].ToString() == "1876") 
      { 
       rows["type"] = 0; 
       rows["rate"] = 30; 
       rows.AcceptChanges(); 
      } 
     } 

     gridViewData.DataSource = myTable; 
     gridViewData.AllowPaging = true; 
     gridViewData.PageSize = 10; 
     gridViewData.DataBind(); 
    } 

以下是按鈕單擊事件從GridView的

protected void btnExportCDR_Click(object sender, EventArgs e) 
    { 
     if (gridViewData.Rows.Count == 0) 
     { 
      lblStatus.Text = "Data is empty. Can not export CDR. Please check your filtering dates."; 
     } 
     else 
     { 
      Response.Clear(); 
      Response.Buffer = true; 
      Response.AddHeader("content-disposition", "attachment;filename=CDRMMCC_" + System.DateTime.Now.ToShortDateString() + ".csv"); 
      Response.Charset = ""; 
      Response.ContentType = "application/text"; 


      bindGridView(); 
      gridViewData.AllowPaging = false; 



      StringBuilder sb = new StringBuilder(); 

      //I did a trace here, gridViewData.Columns.Count is 0. That's why it got skipped, I think. 
      for (int k = 0; k < gridViewData.Columns.Count; k++) 
      { 
       sb.Append(gridViewData.Columns[k].HeaderText + ","); 

      } 
      sb.Append("\r\n"); 
      for (int i = 0; i < gridViewData.Rows.Count; i++) 
      { 
       for (int k = 0; k < gridViewData.Columns.Count; k++) 
       { 
        sb.Append(gridViewData.Rows[i].Cells[k].Text + ","); 

       } 
       sb.Append("\r\n"); 
      } 
      Response.Output.Write(sb.ToString()); 
      Response.Flush(); 
      Response.End(); 
     } 
    } 

請諮詢導出數據。

+0

添加一個斷點並逐步執行代碼。 myTable實際上是否有任何行? – 2012-02-04 09:58:15

+0

@Kadajski是的。它有10行。我做了斷點,並且For循環列被跳過,但不是行。 – 2012-02-04 10:05:31

+0

從myTable導出而不是gridView。 – 2012-02-04 10:15:02

回答

1

如果使用GridViewAutoGenerateColumns屬性設置爲true,則Columns集合將爲空。該屬性的MSDN文檔說:

「自動生成的綁定列字段未添加到Columns集合」。

這就是您的Columns系列爲空的原因。 Henk Holterman指出,直接使用您的DataTable來生成您的CSV文件。

另一種方法是將AutoGenerateColumns屬性設置爲false並明確定義列。

0

除了Hans的答案,你可以使用GridView的RenderControl這減少了你的工作。

StringWriter strWriter = new StringWriter(); 
HtmlTextWriter htmlWriter = new HtmlTextWriter(strWriter); 

MyGridView.RenderControl(htmlWriter); 
Response.Write(strWriter.ToString());