C# datagridviewのエラーと解決法

このQ&Aのポイント
  • C#のdatagridviewで「列の FillWeight 値の合計が 65535 を超えることはできません。」というエラーが出る場合の解決法を教えてください。
  • C#のdatagridviewでヘッダー部分が文字化けしてしまう場合の解決法を教えてください。
  • C#のdatagridviewでcsvのすべてのデータを表示させたいが、2列しか表示されない場合の解決法を教えてください。
回答を見る
  • ベストアンサー

C# datagridview

いくつかこまごまとしたものをまとめてご質問させて頂きますが, 1)csvファイルを読込,ある処理を行おうとすると 「列の FillWeight 値の合計が 65535 を超えることはできません。」 というエラーが出て処理が出来ません.このエラーの解消法を教えて頂けないでしょうか? 2)画像のように読み込んだヘッダー部分が文字化けしてしまいます. こちらの解消法をご教授頂けないでしょうか? 3)csvのすべてのデータをdatagridviewに表示させたいのですが,2列分しか表示されません. 下記に2)とも関連したプログラムを記載いたします.どなたかご教授願えないでしょうか? 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) { if (r == 0) { 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(); tabControl1.SelectedIndex = 1; }

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

元のCSVを提示していただいたほうがいいかも データは何列必要なんでしょう また CSVの文字コードは何で保存してありますか? Shift-JISでしょうか

Ashgin
質問者

補足

とりあえずデータは30列ぐらい必要です. 文字コードはおそらくおっしゃられているものです. ご教授願いいたします.

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

この書き方なら エンコードによる文字化けではないように思えます 30列追加ということであれば CSVの読み込みループの中で列の追加というより 読み込みループに入る前に 列の設定をする方向だと思います if (sfd.ShowDialog() == DialogResult.OK) {   // ここで列の追加を行う   dataGridView1.Columns.Add("clmName1", "日付");   for ( int n = 1; n < 31; n++ )   {     String ss1 = String.Format("Time{0}", n );     String ss2 = String.Format("データ{0}", n );     this.dataGridView1.Columns.Add(ss1,ss2);   }   // ココまでを追加   // 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)     {       // ここはコメントアウト         // if (r == 0)       // {       //   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();   tabControl1.SelectedIndex = 1; }

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

文字化けが Shift-JISによるものなら System.IO.StreamReader sw = new System.IO.StreamReader(sfd.FileName); を エンコードつきのコンストラクターに変えましょう System.IO.StreamReader sw = new System.IO.StreamReader(sfd.FileName, System.Text.Encoding.GetEncoding(932)); といった具合です

Ashgin
質問者

補足

ありがとうございます. 追記で保存の場合でも同じように定義してやれば 文字を文字化けさせずに保存できるのでしょうか? 参考に同じように保存する際に定義しているプログラムを書きに記載いたします. ご教授よろしくお願いいたします. // ファイルを指定してインスタンス作成 System.IO.StreamWriter sw = new System.IO.StreamWriter(sfd.FileName);

関連するQ&A

  • C# datagridview csv 読込

    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(); }

  • C# プログラム

    今,下記のようなプログラムを組んでdatagridviewのデータをcsvに保存するようにしようとしているのですが,1つのデータであれば保存が出来たのですが,今行いたいのはdatagridviewにあるデータすべてをcsvに保存したいのです.おそらく配列か何かに入れないといけないんだとは思うのですが, どなたかご教授頂けないでしょうか? private void button2_Click(object sender, EventArgs e) { //データテーブル設定 int R, C; R = dataGridView1.RowCount - 1; C = dataGridView1.ColumnCount - 1; 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) //c = dataGridView1[Rdata, Gdata].Value.ToString(); // 以下を変更 string c = Convert.ToString(dataGridView1.Rows[0].Cells[0].Value); // 以下ファイル書き込みと保存 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(c); } catch { // エラー処理(これだとダメだけどとりあえず) MessageBox.Show("ファイル書き込みエラー", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { // 解放 sw.Dispose(); sfd.Dispose(); } }

  • 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(); } }

  • C# 列の挿入

    どうしてもわからないことがありまして,datagridview上に列を追加しようとすると, 「列のFillWeght値の合計が65535を超えることはできません」 というエラーが出ます.追加する列数は8760列ですが,このエラーは列数が65535列を超えている? ということなのでしょうか? どうにも解決できないので,どなたかご教授願えないでしょうか? dataGridView1.Columns.Add("clmName1", "日付"); for (int n = 0; n < 8760; n++) { String ss1 = String.Format("Time{0}", n); String ss2 = String.Format("データ{0}", n); this.dataGridView1.Columns.Add(ss1, ss2); }

  • C# csvをexcelシートのように No.2

    VS2017でC#を独学しています。 https://okwave.jp/qa/q9340465.html 上記で質問したように、Tabcontrolの中にタブページごとにdatagridview表を挿入し、 そこにCSVファイルを表示させたいと思っています。 今、このような形で動きますが、あってますでしょうか? 下記コードの回りくどい部分や、おかしい部分など教えていただけるとうれしいです。 よろしくお願いします。 private System.Windows.Forms.DataGridView dg; private TabPage tabPage9; private void button3_Click(object sender, EventArgs e) { tabPage9 = new TabPage(); tabPage9.Text = "Tab" + i; tabControl1.TabPages.Add(tabPage9); // 追加したタブページにdatagridviewを追加する。 this.dg = new System.Windows.Forms.DataGridView(); this.dg.Name = "dg"; tabPage9.Controls.Add(dg); this.dg.Dock = DockStyle.Fill; this.dg.Columns.Add("", "No"); this.dg.Columns.Add("", "Name"); this.dg.Rows.Add(3); this.dg[0, 0].Value = "aaa"; this.dg[0, 1].Value = "bbb"; i++; }

  • DataGridViewのコンボボックスについて

    開発環境:Visual Basic 2005 DataGridViewのDataGridViewTextBoxColumnの1行目をコンボボックスにして、 そのコンボボックスのドロップダウン幅を100に設定しようとしていますが、うまくいきません。 DataGridViewをフォームに貼り付け、以下のプログラムを実行すると、幅が120くらいになってしまいます。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DataGridView1.Columns.Clear() DataGridView1.AllowUserToAddRows = False Dim TextColumn As New DataGridViewTextBoxColumn TextColumn.Name = "Name" TextColumn.Width = 100 Dim ComboColumn As New DataGridViewComboBoxColumn ComboColumn.Name = "Type" Dim List() As String = {"Type A", "Type B", "Type O"} ComboColumn.DataSource = List ComboColumn.DropDownWidth = 100 DataGridView1.Columns.Add(TextColumn) DataGridView1.Columns.Add(ComboColumn) For i As Integer = 1 To 5 DataGridView1.Rows.Add() Next Dim ComboCell As New DataGridViewComboBoxCell Dim NameList() As String = {"Name A", "Name B", "Name C"} ComboCell.DataSource = NameList ComboCell.DropDownWidth = 100 DataGridView1.Rows(0).Cells(0) = ComboCell End Sub どこが問題なのかどなたかご教授いただけると助かります。どうぞよろしくお願い致します。

  • C++/CLIでのDataGridViewの使い方

    以前に質問させていただいたのですが、要点を得ていなかったため再度質問させていただいきます。 VC++2005のC++/CLIでプログラムを作成しています。 CSVファイルから内容を読み込み、DataGridVeiwに表示させたいと考えています。 CSVファイルを配列に読み込んで、表示するところまでは出来ています。 以下CSVファイルを読み込んで、コンソール出力するプログラムの一部 int i; StreamReader^ sr=gcnew StreamReader("hoge.csv"); String^ text=sr->ReadToEnd(); array<String^>^ line=text->Split(gcnew array<String^> {"\r\n", "\r", "\n"},StringSplitOptions::RemoveEmptyEntries); array<array<String^>^>^ table= gcnew array<array<String^>^>(line->Length); for (i=0; i<line->Length; i++) { table[i]=line[i]->Split(','); } for each (array<String^>^ output in table){ for(i=0; i<output->Length; i++){ Console::Write(output[i]); //行出力 } } 初歩的なことだとは思うのですが・・・ コンソール出力部分をDataGridViewで出力表示させるには どのように書けばいいでしょうか。 よろしくお願いします。

  • DataGridViewから値取得

    DataGridViewにボタンと項目2つが配置されています。 DataGridView1 DataGridView1.Columns("btn").HeaderText = "ボタン" DataGridView1.Columns("item1").HeaderText = "アイテム1" DataGridView1.Columns("item2").HeaderText = "アイテム2" ボタンを押すと、押した行のレコードを取得したいです。 ボタンのところを押下すると、 イベントハンドラで何行目か分かるサンプルをネットで見つけました。 惜しいですが、やりたいのと少し違いました。 'CellContentClickイベントハンドラ Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick Dim dgv As DataGridView = CType(sender, DataGridView) Dim test_item1 As String Dim test_item2 As String ' "btn"列ならば、ボタンがクリックされた If dgv.Columns(e.ColumnIndex).Name = "btn" Then MessageBox.Show((e.RowIndex.ToString() + "行のボタンがクリックされました。")) End If ' ここに押された行のitem1の値をセット ' test_item1 = (A) ' ここに押された行のitem2の値をセット ' test_item2 = (B) End Sub (A)、(B)に何を記述すれば値を取得できますか?

  • C# datagridview データバインド系

    datagridviewのデータバインドについて教えてください. 今,下記のプログラム(一部)を組んで処理を行おうとしていますがうまくいかないため 何が悪いのか教えて頂けないでしょうか? 今datagridviewをデータテーブルにバインドしています. for (j = t; j < R - 1; j++) { object Ti = this.dataGridView1.Rows[j].Cells[0].Value; object Tibf = this.dataGridView1.Rows[j + 1].Cells[0].Value; string TiS = Convert.ToString(Ti); string TiSbf = Convert.ToString(Tibf); # region // シリアル値化 long serial = DateTime.Parse(TiS).ToBinary(); long serialbf = DateTime.Parse(TiSbf).ToBinary(); long parsesum = serial + Oneparse; if (serialbf != parsesum) { dataGridView1.Rows.Insert(j + 1, 1); // シリアル値から復元 DateTime dtm = DateTime.FromBinary(parsesum); string s = Convert.ToString(dtm); // 指定した書式で日付を文字列に変換する string stPrompt1 = dtm.ToString("yyyy/M/d H:mm"); this.dataGridView1.Rows[j + 1].Cells[0].Value = stPrompt1; } } 簡単に言うと,行を追加したいのですが,forの前でデータソースをnullにすると object Ti = this.dataGridView1.Rows[j].Cells[0].Value;でエラー if (serialbf != parsesum)の後にすると dataGridView1.Rows.Insert(j + 1, 1);でエラー が起こります.どちらの場合も下記のエラーが出ます. インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。 パラメーター名: index 本当に困っています. よろしくお願いいたします.

  • C# DataGridViewにデータを追加したい。

    C# DataGridViewにデータを追加したい。 DataGridViewにレコードを追加したいのですが、Formのロードイベントで以下コードを実行しています。 // テーブルを作成 DataSet dataSet1 = new DataSet("商品マスター"); DataTable dataTable1 = dataSet1.Tables.Add("製品テーブル"); DataColumn dataClumn1 = dataTable1.Columns.Add("ID", typeof(int)); DataColumn dataClumn2 = dataTable1.Columns.Add("名前", typeof(int)); // テーブルにデータを追加 dataTable1.Rows.Add(new Object[] { 1, name1}); dataTable1.Rows.Add(new Object[] { 2, name2}); dataGridView1.DataSource = dataTable1; としています。 Formにボタンを配置し、ボタンクリック時にテキストボックス[txtProName]のデータを レコード追加したいのですが、記入の仕方がわかりません。 まず、 DataSet dataSet1 = new DataSet("商品マスター"); DataTable dataTable1 = dataSet1.Tables.Add("製品テーブル"); をロードイベントメソッドに記入しているのも問題がありそうなのですが、 良く理解できません。 ボタンイベントでデータを挿入する方法等、記入方法のご教授よろしくお願いいたします。 当方、超初心者なので、出来れば、ソースコードもお願いいたします。m(_ _)m

専門家に質問してみよう