2012-02-04 286 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());