こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C#でのcsv保存

今,下記のようなプログラムを組んでいます.ですが,うまくdataGridviewのデータが保存されません.何がいけないのでしょうか?だれかご教授よろしくお願いいたします.

int R,C;
R = dataGridView1.RowCount - 1;
C = dataGridView1.ColumnCount - 1;
string[] cdata = new string[R];

//string Ter =Convert.ToString(R);
//string Tec = Convert.ToString(C);
//textBox1.Text = Ter;
//textBox2.Text = Tec;
for (int Gdata = 1; Gdata < R; Gdata++)
{
string c = Convert.ToString(dataGridView1.Rows[Gdata].Cells[0].Value);
cdata[Gdata] = c;
//saveFileDialog1.Filter = "csvファイル (*.csv)|*.csv";

//if (saveFileDialog1.ShowDialog() == DialogResult.OK)
//{
// int cdata = Convert.ToInt16(c);
// cdata.saveNewCSVdata(saveFileDialog1.FileName);
//}
}
//SaveFileDialogクラスのインスタンスを作成
SaveFileDialog sfd = new SaveFileDialog();
//ダイアログを表示する
if (sfd.ShowDialog() == DialogResult.OK)
{
//OKボタンがクリックされたとき
//選択された名前で新しいファイルを作成し、
//読み書きアクセス許可でそのファイルを開く
//既存のファイルが選択されたときはデータが消える恐れあり
System.IO.Stream stream;
stream = sfd.OpenFile();
if (stream != null)
{
//ファイルに書き込む
System.IO.StreamWriter sw = new System.IO.StreamWriter(stream);
sw.Write(cdata);
//閉じる
sw.Close();
stream.Close();
}
}

投稿日時 - 2011-11-04 09:10:53

QNo.7112301

すぐに回答ほしいです

質問者が選んだベストアンサー

列側の位置が指定されてないので以下の様にすれば値が取れると思います。
(スペースは全角なので置換してください)

追加・変更部分を//##で囲んであります。
for (int Gdata = 1; Gdata < R; Gdata++)
{
//##↓
 for (int Rdata = 1; Rdata < C; Rdata++) //←追加
 {
// 以下を変更
//  string c = Convert.ToString(dataGridView1.Rows[Gdata].Cells[0].Value);
  string c = dataGridView1[Rdata, Gdata].Value.ToString();
//##↑
  cdata[Gdata] = c;
  //saveFileDialog1.Filter = "csvファイル (*.csv)|*.csv";
  
  //if (saveFileDialog1.ShowDialog() == DialogResult.OK)
  //{
  // int cdata = Convert.ToInt16(c);
  // cdata.saveNewCSVdata(saveFileDialog1.FileName);
  //}
//##↓
 }
//##↑
}

投稿日時 - 2011-11-04 09:54:59

お礼

早速のご回答ありがとうございます.

dataGridviewの列の値をすべてcsvに保存するにはどうすればいいか御存じでしょうか?

もし,御存じであればご教授いただけないでしょうか?

よろしくお願いいたします.

投稿日時 - 2011-11-04 11:03:26

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

No1です。

バインドは書き込みの処理前にやる必要があります。
(データのないものを取り出しても意味がないので)
ざっくり書くとこんな感じです。

--- 別の処理 ---
1: データバインド
dataGridView1.DataSource = xx ←xxは日付データすべてが入っている配列を指定する

下のCSV書き込み処理の中で再指定でもいいけど面倒

--- 別の処理 ---


--- CSV書き込み処理開始(引数にバインド済のdataGridView1) ---

2: 変数の宣言
int R,Cとか

3: ダイアログによる条件分岐(YESの場合)

 4: ループ開始

  4-1: 行ループ
       1でバインドしたデータを取り出してtmpdataに格納

  4-2: 列ループ
       一列終わったらwdataにtmpdataの内容を追加する。

 5: ループ終了

6: CSVファイル書き込み
wdataの中身をstreamに渡す。

7: ダイアログによる条件分岐(YESの場合)終わり、またはNOだった場合を書く

--- CSV書き込み処理終了 ---


質問者さんのコードですと4-1の列ループの中でDataSouceを設定しています。
これだとそもそもループしても空データになるので、DataGridViewに値を入れた時にDataSouceを設定する必要があります。
DataSouceは表示されているデータ全てが対象になるので、文字列変数cではなく日付データ全てがある配列にする必要があります。

DataGridViewに関する資料はネットで探せばたくさんあるので、いろいろ検索してみてください。

投稿日時 - 2011-11-04 16:09:04

ANo.3

No1です。

最初の
string c = dataGridView1[Rdata, Gdata].Value.ToString();
ここの部分でcに値は入っていますか?

もしここで入っていないようならデータバインドしてないのではないかと。

dataGridView1.DataSource = 元になるデータ

ここでデータグリッドに入っている値の元(DataTableとか)をセットします。

やり方としては
・BindingSourceのインスタンスを作る

・配列そのものをソースに指定(この場合は"1900/1/1 0:00:00"が宣言された配列)←arrdataと仮定

このいずれかを

dataGridView1.DataSource = arrdata;

というようにループに入る前にバインドしてあげる必要があります。


DataGridViewについては以下のサイトが解り易いかと思います。
http://japan.internet.com/developer/20070522/26.html

投稿日時 - 2011-11-04 13:58:36

お礼

御回答ありがとうございます.

申し訳ありませんが,今一度私のプログラムを見て頂けないでしょうか?
よろしくお願いいたします.

//データテーブル設定
int R,C;
R = dataGridView1.RowCount - 1;
C = dataGridView1.ColumnCount - 1;
string[] cdata = new string[R];

string wdata = string.Empty;
string tmpdata = string.Empty;


//string Ter =Convert.ToString(R);
//string Tec = Convert.ToString(C);
//textBox1.Text = Ter;
//textBox2.Text = Tec;
//SaveFileDialogクラスのインスタンスを作成
//SaveFileDialog sfd = new SaveFileDialog();
//ダイアログを表示する
//if (sfd.ShowDialog() == DialogResult.OK)
{
for (int Gdata = 0; Gdata < R; Gdata++)
{
 for (int Rdata = 0; Rdata < C; Rdata++) //←追加
 {
// 以下を変更
//  string c = Convert.ToString(dataGridView1.Rows[Gdata].Cells[0].Value);
  string c = dataGridView1[Rdata, Gdata].Value.ToString();
dataGridView1.DataSource = c;
  // 1行目はそのまま
  if (Gdata == 0)
  {
   // 1行目
   tmpdata = c;
  }
  else
  {
   // 2行目以降は「,」を付ける
   tmpdata += "," + c;
  }
  //cdata[Gdata] = c;
//##↑

  //saveFileDialog1.Filter = "csvファイル (*.csv)|*.csv";
  
  //if (saveFileDialog1.ShowDialog() == DialogResult.OK)
  //{
  // int cdata = Convert.ToInt16(c);
  // cdata.saveNewCSVdata(saveFileDialog1.FileName);
  //}
//##↓
 }
 // 列を抜けたら改行コードを付与する
  wdata+= tmpdata + "\n";
//##↑
}


// 以下ファイル書き込みと保存
string strName = "xxx.csv"; // 仮のファイル名
string strPath = "c:/csv/"; // 仮のディレクトリ名
SaveFileDialog sfd = new SaveFileDialog();
sfd.InitialDirectory = strPath;
sfd.FileName = strName;
sfd.Filter = "CSVファイル(*.csv)|*.csv";
sfd.Title = "保存先を指定してください";
sfd.RestoreDirectory = true;
sfd.CheckFileExists = false;

if (sfd.ShowDialog() == DialogResult.OK)
{
 // ファイルを指定してインスタンス作成
 System.IO.StreamWriter sw = new System.IO.StreamWriter(sfd.FileName);
 try
 {
  // ファイル書き込み
  sw.Write(wdata);
 }
 catch
 {
  // エラー処理(これだとダメだけどとりあえず)
  MessageBox.Show("ファイル書き込みエラー","エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
 finally
 {
  // 解放
  sw.Dispose();
  sfd.Dispose();
 }
}

投稿日時 - 2011-11-04 15:22:01

ANo.2

No1です。
CSVでということなのでこんな感じでしょうか。
全てのグリッドの値を取得とのことなので最初の変数宣言も修正しています。

追加・変更部分は//##で囲んであります。

int R,C;
//##
//R = dataGridView1.RowCount - 1;
//C = dataGridView1.ColumnCount - 1;string wdata = string.Empty;
R = dataGridView1.RowCount;
C = dataGridView1.ColumnCount;

//データ書き込み用
string wdata = string.Empty;
string tmpdata = string.Empty;
//##

// 行ループ
for (int Gdata = 0; Gdata < R; Gdata++)
{
//##↓
 // 列ループ
 for (int Rdata = 0; Rdata < C; Rdata++) //←追加
 {
// 以下を変更
//  string c = Convert.ToString(dataGridView1.Rows[Gdata].Cells[0].Value);
  string c = dataGridView1[Rdata, Gdata].Value.ToString();
  // 1行目はそのまま
  if (Gdata == 0)
  {
   // 1行目
   tmpdata = c;
  }
  else
  {
   // 2行目以降は「,」を付ける
   tmpdata += "," + c;
  }
  //cdata[Gdata] = c;
//##↑

  //saveFileDialog1.Filter = "csvファイル (*.csv)|*.csv";
  
  //if (saveFileDialog1.ShowDialog() == DialogResult.OK)
  //{
  // int cdata = Convert.ToInt16(c);
  // cdata.saveNewCSVdata(saveFileDialog1.FileName);
  //}
//##↓
 }
 // 列を抜けたら改行コードを付与する
 wdata += tmpdata + "\n";
//##↑
}

// 以下ファイル書き込みと保存
string strName = "xxx.csv"; // 仮のファイル名
string strPath = "C:\csv\" // 仮のディレクトリ名
SaveFileDialog sfd = new SaveFileDialog();
sfd.InitialDirectory = strPath;
sfd.FileName = strName;
sfd.Filter = "CSVファイル(*.csv)|*.csv";
sfd.Title = "保存先を指定してください";
sfd.RestoreDirectory = true;
sfd.CheckFileExists = false;

if (sfd.ShowDialog() == DialogResult.OK)
{
 // ファイルを指定してインスタンス作成
 StreamWriter sw = new StreamWriter(sfd.FileName);
 try
 {
  // ファイル書き込み
  sw.Write(wdata);
 }
 catch
 {
  // エラー処理(これだとダメだけどとりあえず)
  MessageBox.Show("ファイル書き込みエラー","エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
 finally
 {
  // 解放
  sw.Dispose();
  sfd.Dispose();
 }
}

投稿日時 - 2011-11-04 12:05:29

お礼

上記のプログラムを試してみましたが,csvの中身が空っぽでした.
なぜでしょうか?

御返答よろしくお願いいたします.

投稿日時 - 2011-11-04 13:12:54

あなたにオススメの質問