今,下記のようなプログラムを組んでいます.ですが,うまく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();
}
}
No.1ベストアンサー
- 回答日時:
列側の位置が指定されてないので以下の様にすれば値が取れると思います。
(スペースは全角なので置換してください)
追加・変更部分を//##で囲んであります。
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);
//}
//##↓
}
//##↑
}
早速のご回答ありがとうございます.
dataGridviewの列の値をすべてcsvに保存するにはどうすればいいか御存じでしょうか?
もし,御存じであればご教授いただけないでしょうか?
よろしくお願いいたします.
No.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に関する資料はネットで探せばたくさんあるので、いろいろ検索してみてください。
No.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. …
御回答ありがとうございます.
申し訳ありませんが,今一度私のプログラムを見て頂けないでしょうか?
よろしくお願いいたします.
//データテーブル設定
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();
}
}
No.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();
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#】パス名で無効な文字
-
VBA 毎日取得するデータを反映...
-
エクセル形式のファイルの読み込み
-
CSVファイル作成
-
<csv>複数条件で検索・抽出し、...
-
VBAでcsvファイルを読み込んで...
-
複数のcsvファイルをフォルダご...
-
マクロから出力されるcsvのダブ...
-
ファイルのアクセス回数について
-
バッチファイルが保存されてい...
-
エクセルのプロパティーでセキ...
-
マインクラフトPCをプレイしよ...
-
VBA 最新のフォルダ取得
-
マクロVBAのフォルダ階層別で検...
-
pythonでDepixを起動
-
excel VBA Dirにて検索したフォ...
-
Wordで差込印刷した後に別々の...
-
バッチファイル 二つ上のディ...
-
エクセルのマクロについて教え...
-
Excelのフッダ-に「ファイルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
csvファイル 項目数取得
-
CSV形式での保存時に”文字列...
-
マクロから出力されるcsvのダブ...
-
csvファイルでの日付設定「yyyy...
-
複数のcsvファイルをExcelに一...
-
バッチでCSVを処理する時、空の...
-
エクセルVBA 大容量CSVファイル...
-
データ解析ソフトRでのファイル...
-
VBAでcsvファイルを読み込んで...
-
csvファイルのデータの一部を取...
-
複数のCSVファイルのAccessテー...
-
CSVファイル作成
-
【C#】パス名で無効な文字
-
csvファイルのデータの間引きを...
-
csvファイルを列数ごとに分割す...
-
エクセル形式のファイルの読み込み
-
【エクセル マクロ】読み込ん...
-
CSVファイルの項目行を削除...
-
c#でcsvから指定の1行だけを読...
おすすめ情報