質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • C#

    7115questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • SQL

    2392questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • CSV

    635questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

DataGridViewのヘッダーの取得してCSVに表示すると列表示になる

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 670

xlostdjx

score 25

Visual Studio2015の Windows Forms アプリ

下記のようにDataGridViewのヘッダーを取得してCSVに書き込みすると列の頭だけに表示させたいのですが列と行にずらりと表示されてしまします
どこがおかしいのでしょうか?

strList.Add(DataGrid.Columns[j].HeaderCell.Value.ToString());

 /// <summary>
        /// CSV出力ボタン押下時
        /// </summary>
        private void CSV_Output_Click(object sender, EventArgs e)
        {
            // SaveFileDialogを作成する          
            SaveFileDialog result = new SaveFileDialog();
            result.Title = "ファイルを保存する";
            // 初期表示時のディレクトリを指定
            result.InitialDirectory = @"C:\Users\Admin\Downloads";
            // ファイル名を指定、取得する
            result.FileName = @"ForOutput.csv";
            // 選択できるファイルの種類を指定する
            result.Filter = "CSV (カンマ区切り)|*.csv";
            // ファイル出力(保存)ダイアログ表示 
            DialogResult FileOutput = result.ShowDialog();

            // //「保存」ボタンが押された時の処理
            if (FileOutput == DialogResult.OK)
            {
                //指定されたファイルのパスを取得する
                string fileName = result.FileName;
            }
            else if (FileOutput == DialogResult.Cancel)
            {
                //「キャンセル」ボタンまたは「×」ボタンが選択された時の処理
            }

            // 保存用のファイルを開く                     (       ファイルパス      )( ファイル名 )                           (文字コード指定)
            using (StreamWriter writer = new StreamWriter(@"C:\Users\Admin\Downloads\ForOutput.csv", false, Encoding.GetEncoding("shift_jis")))
            {
                // 行数を取得する
                int rowCount = DataGrid.Rows.Count;
                if (DataGrid.AllowUserToAddRows == true)
                {
                    // 最後の新規入力用の1行分を差し引く
                    rowCount = rowCount - 1;
                }

                // rowCount 行数文ループ
                for (int i = 0; i < rowCount; i++)
                {
                    // リストの初期化
                    List<String> strList = new List<String>();

                    // Columns.Count カルムと同じ数だけループする
                    for (int j = 0; j < DataGrid.Columns.Count; j++)
                    {
                        //列と行を追加していく。
                        strList.Add(DataGrid[j, i].Value.ToString());



 *おかしい箇所→→                       //ヘッダを出力   *
                        strList.Add(DataGrid.Columns[j].HeaderCell.Value.ToString());



                    }

                    // 配列へ変換
                    String[] strArray = strList.ToArray();
                    // CSV 形式に変換(ファイル出力)
                    String strCsvData = String.Join(",", strArray);
                    writer.WriteLine(strCsvData);
                }
            }
        }

 

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

行数文ループの中で毎回ヘッダー出力しているからです。
forの前に記述して下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/22 13:33

    forの前に記述したのですが表示されないです。

    // 保存用のファイルを開く ( ファイルパス )( ファイル名 ) (文字コード指定)
    using (StreamWriter writer = new StreamWriter(@"C:\Users\Admin\Downloads\ForOutput.csv", false, Encoding.GetEncoding("shift_jis")))
    {

    int ColumnsCount = DataGrid.ColumnCount;
    int rowCount = DataGrid.Rows.Count;
    if (DataGrid.AllowUserToAddRows == true)
    {
    // 最後の新規入力用の1行分を差し引く
    rowCount = rowCount - 1;
    }

    //ヘッダを出力
    DataGrid.Columns[9].HeaderCell.Value.ToString();

    // rowCount 行数文ループ
    for (int i = 0; i < rowCount; i++)
    {
    // リストの初期化
    List<String> strList = new List<String>();
    // Columns.Count カルムと同じ数だけループする
    for (int j = 0; j < DataGrid.Columns.Count; j++)
    {
    //列と行を追加していく。
    strList.Add(DataGrid[j, i].Value.ToString());

    }

    // 配列へ変換
    String[] strArray = strList.ToArray();
    // CSV 形式に変換(ファイル出力)
    String strCsvData = String.Join(",", strArray);
    writer.WriteLine(strCsvData);
    }
    }
    }

    キャンセル

  • 2018/06/22 13:43

    リストに入れるところからやらないと駄目ですよ

    キャンセル

  • 2018/06/22 13:49

    ど忘れしていました。申し訳ないです。

    キャンセル

  • 2018/06/22 14:57

    最後に質問です。間違いとかではなく 気になったのですが、
    配列に変換したものをString.Joinでカンマ区切りで指定しているのですが
    カンマ区切りをするとなぜ行ずつ分けられて出力されるのでしょうか??
    自分の考えだと末尾にカンマがつくだけと思っています。
    調べてみてもピンとこなかったので、
    // CSV 形式に変換(列と行を出力) //カンマ区切り
    String stgCsvData = String.Join(",", stgArray);

    キャンセル

checkベストアンサー

0

出力したい内容は下記の内容だと思います。


見出し1,見出し2,見出し3,見出し4
データ1-1,データ1-2,データ1-3,データ1-4
データ2-1,データ2-2,データ2-3,データ2-4
データ3-1,データ3-2,データ3-3,データ3-4
データ4-1,データ4-2,データ4-3,データ4-4


上記の内容を出力しようとすると、ヘッダ部は最初に1回だけ
出力すればいいだけです。
ですので、データ部分の出力のループに入れるのではなく、
ヘッダ部の出力とデータ部の出力を分けてください。

List<String> strList;

strList = new List<String>();
// ヘッダ部の出力
// Columns.Count カルムと同じ数だけループする
for (int j = 0; j < DataGrid.Columns.Count; j++)
{
    //カラムのヘッダのテキストをリストに追加
}
// 配列へ変換
// CSV 形式に変換(ファイル出力)

// データ部の出力
// rowCount 行数文ループ
for (int i = 0; i < rowCount; i++)
{
    // リストの初期化
    strList = new List<String>();

    // Columns.Count カルムと同じ数だけループする
    for (int j = 0; j < DataGrid.Columns.Count; j++)
    {
        //列と行を追加していく。
    }
    // 配列へ変換
    // CSV 形式に変換(ファイル出力)
}


元ソースのコメントを入れて、分かりやすくしてみました。

DataGridViewからCSVへ出力するサンプルは検索すればたくさん出てきますから
参照されてはどうでしょう?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/22 13:34

    このやり方だとダメということですか??

    // 配列へ変換
    String[] strArray = strList.ToArray();
    // CSV 形式に変換(ファイル出力)
    String strCsvData = String.Join(",", strArray);
    writer.WriteLine(strCsvData);

    キャンセル

  • 2018/06/22 13:56

    元ソースを元に回答を編集しました。

    キャンセル

  • 2018/06/22 14:57

    最後に質問です。間違いとかではなく 気になったのですが、
    配列に変換したものをString.Joinでカンマ区切りで指定しているのですが
    カンマ区切りをするとなぜ行ずつ分けられて出力されるのでしょうか??
    自分の考えだと末尾にカンマがつくだけと思っています。
    調べてみてもピンとこなかったので、
    // CSV 形式に変換(列と行を出力) //カンマ区切り
    String stgCsvData = String.Join(",", stgArray);

    キャンセル

  • 2018/06/22 15:22

    String.Join(",", stgArray)で各項目をカンマで繋ぐだけというのは合っています。
    次の「WriteLine」は1行書き込むです。ここで改行コードが付加されて書き込まれます。

    キャンセル

  • 2018/06/22 15:58 編集

    キャンセル

  • 2018/06/22 15:58

    各項目をカンマで繋ぐだけというのは合っています。
    とありますが、CSVに出力したときに行末尾にカンマが表示されていませんがそのあたりはどういうことなのでしょうか??またカンマで繋ぐから表示されないのか??

    キャンセル

  • 2018/06/22 16:02

    各項目にカンマを付与するのではなく「繋ぐ」ということです。
    AとBとCがあって、これをカンマで繋ぐとしたら
    A,B,Cになりますよね?

    キャンセル

  • 2018/06/22 16:09

    先程、カンマをピリオドに変えて実行した所 行が他の行と繋がったまま表示されたのですが
    カンマとピリオドでなぜここまで変わるのでしょうか??

    キャンセル

  • 2018/06/22 16:13

    CSVファイルは「カンマ区切り」のテキストファイルです。
    カンマがなくなれば、1つの項目となります。

    キャンセル

  • 2018/06/22 16:17

    少し意味を履き違えていたみたいで、エクセルはカンマが表示されないものなのでしょうか??

    キャンセル

  • 2018/06/22 16:26

    先ほど書いたようにCSVファイルとは各項目をカンマで区切ったテキストファイルです。
    実際に出力したものを見たいのであれば、メモ帳などのテキストエディタで見てください。
    Excelは各項目を見やすく表示するためカンマを省略して各セルに格納してくれているのです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    C# DataGridViewの新規行追加について

    現在C#、Visual Studio2013 を勉強しています ■実現したいこと 入力した値をDataGridViewに新規行を追加して表示させる プログラムの

  • 解決済

    C# DataGridViewについて

    前提・実現したいこと C#で「ボタンをクリックすると、XMLの内容をDataGridView」に表示するプログラムを作りました。 しかし、ボタンを何回もクリックすると、XM

  • 解決済

    VB.NETでデータを保持したい

    Visual Studioを使いVB.NETでウィンドウズアプリケーションを作成しています。 DataGridViewを配置し、CSVを開きそのデータをDataGridView

  • 解決済

    DataGridViewのイベント

    Form1の画面にDataGridViewを貼りつけ、DataGridViewのカラムを3つ追加します。 カラム1のColumn TypeはDataGridView TextB

  • 解決済

    WPFでDataGridに値が表示されない

    Visual Studio 2017 Communityを用いて行っています。C#,WPF共にまだまだ勉強中ですので基礎的な点で間違えているかもしれません。そのような点についてもぜ

  • 解決済

    datagridviewでのドロップダウンメニューの実装

    C#のdatagridviewでヘッダーにドロップダウンメニューを実装しようと考えているのですが、「DataGridViewAutoFilter」というクラスライブラリを使う方法し

  • 解決済

    C# csvファイルの読み込みとDataGridへの表示

     前提・実現したいこと "作品名","作者","出版社","巻数","記入日", A,AA,AAA,AAAA,2018/05/02 (水) 15:10:24 B,BB,BBB,BB

  • 解決済

    引数で持ってくる方法

    private void CSV_Output_Click(object sender, EventArgs e) のところで引数でもってきたいのですがエラーになります。 エラー内

同じタグがついた質問を見る

  • C#

    7115questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • SQL

    2392questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • CSV

    635questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。