- ベストアンサー
C#でのcsv保存
- C#でのcsv保存についての質問です。dataGridviewのデータがうまく保存されない問題が発生しています。解決方法を教えてください。
- C#のプログラムでcsvファイルを保存する際に問題が発生しています。具体的には、dataGridviewのデータがうまく保存されないという状況です。解決策を教えてください。
- C#でcsvファイルを保存する方法で問題が発生しています。dataGridviewのデータが正しく保存されないため、解決策を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
列側の位置が指定されてないので以下の様にすれば値が取れると思います。 (スペースは全角なので置換してください) 追加・変更部分を//##で囲んであります。 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); //} //##↓ } //##↑ }
その他の回答 (3)
- shincha119
- ベストアンサー率42% (95/226)
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に関する資料はネットで探せばたくさんあるので、いろいろ検索してみてください。
- shincha119
- ベストアンサー率42% (95/226)
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
お礼
御回答ありがとうございます. 申し訳ありませんが,今一度私のプログラムを見て頂けないでしょうか? よろしくお願いいたします. //データテーブル設定 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(); } }
- shincha119
- ベストアンサー率42% (95/226)
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(); } }
お礼
上記のプログラムを試してみましたが,csvの中身が空っぽでした. なぜでしょうか? 御返答よろしくお願いいたします.
お礼
早速のご回答ありがとうございます. dataGridviewの列の値をすべてcsvに保存するにはどうすればいいか御存じでしょうか? もし,御存じであればご教授いただけないでしょうか? よろしくお願いいたします.