プロが教えるわが家の防犯対策術!

datagridviewにcsvファイルを読み込んでいるのですが,csvファイル内の行列数分のみ列数・行数をdatagridviewに生成したいのですが,どうも必要以上の列数・行数を生成してしまいます.

下記にそのプログラムを記載いたします.
どなたか,必要分のみするにはどうすればよろしいかご教授願えないでしょうか?

private void button1_Click(object sender, EventArgs e)
{
string strName = "xxx.csv"; // 仮のファイル名
string strPath = "c:/csv/"; // 仮のディレクトリ名
OpenFileDialog sfd = new OpenFileDialog();
sfd.InitialDirectory = strPath;
sfd.FileName = strName;
sfd.Filter = "CSVファイル(*.csv)|*.csv|xlsファイル(*.xls)|*.xls|xlsxファイル(*.xlsx)|*.xlsx|テキスト(*.txt)|*.txt";
sfd.Title = "開くファイルを選択してください";
sfd.RestoreDirectory = true;
sfd.CheckFileExists = false;

if (sfd.ShowDialog() == DialogResult.OK)
{
// CSVファイルオープン
System.IO.StreamReader sw = new System.IO.StreamReader(sfd.FileName);
// CSVファイルの各セルをDataGridViewに表示
int r = 0;
String lin = "";
do
{
lin = sw.ReadLine();
if (lin != null)
{
dataGridView1.Columns.Add("clmName1", "日付");
this.dataGridView1.Columns.Add("Time","データ");
this.dataGridView1.Rows.Add();
String[] csv = lin.Split(',');
for (int c = 0; c <= csv.GetLength(0) - 1; c++)
{
if (c < this.dataGridView1.Columns.Count)
{
this.dataGridView1.Rows[r].Cells[c].Value = csv[c];
}
}
r += 1;
}
} while (lin != null);
// CSVファイルクローズ
sw.Close();
}

A 回答 (2件)

以下のように修正してみてください


do
{
  lin = sw.ReadLine();
  if (lin != null)
  {
    if ( r == 0 ) // これを追加
    {        // 最初だけカラムを設定
      dataGridView1.Columns.Add("clmName1", "日付");
      this.dataGridView1.Columns.Add("Time","データ");
    }
    else
    {       // データ行の追加
      this.dataGridView1.Rows.Add();
      String[] csv = lin.Split(',');
      for (int c = 0; c <= csv.GetLength(0) - 1; c++)
      {
        if (c < this.dataGridView1.Columns.Count)
        {
          this.dataGridView1.Rows[r].Cells[c].Value = csv[c];
        }
      }
    }
    r += 1;
  }
} while (lin != null);
といった具合です
# 字下げには全角スペースを使用しているのでエラーになるなら半角スペースに置換して下さい
    • good
    • 0

csvファイルを読むときにはStreamReader.ReadLineとString.Splitの組み合わせよりもMicrosoft.VisualBasic.FileIO.TextFieldParserの方が便利です。


http://www.atmarkit.co.jp/fdotnet/dotnettips/487 …

あとは#1でも指摘されていますが、行の生成は読み込みごとで良いですが列の生成は最初の一回だけにしないとダメですね。

なお、

> this.dataGridView1.Rows[r].Cells[c].Value = csv[c];



> this.dataGridView1[r, c].Value = csv[c];

とも記述できます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!