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

続いてくださいアドバイス

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(); 
     } 
    } 
GridViewの

からデータをエクスポートするには、ボタンのクリックイベントです。

+0

コードを追加してコードをステップ実行します。 myTableには実際に行がありますか? –

+0

@Kadajskiはい。それは10行あります。私はブレークポイントを行い、列のForループはスキップされましたが、行はありませんでした。 –

+0

gridViewではなくmyTableからエクスポートします。 –

答えて

1

GridViewに設定されたAutoGenerateColumnsプロパティを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()); 
関連する問題