• 締切済み

【C# DataGridViewについて】

C#であるWindowsFormアプリケーションを作っているのですが imagelistに格納されている画像群をDataGridViewで表示しようと for (int y = 0; y < gy; ++y) { DataGridViewRow row = new DataGridViewRow(); for (int x = 0; x < gx; ++x) { DataGridViewImageCell imageCell = new DataGridViewImageCell(); imageCell.Value = imageList.Images[y * gx + x]; row.Cells.Add(imageCell); } dataGridView1.Rows.Add(row);//ここが問題 } としたところ、印をつけたところで、「System.InvalidOperationException」 なる例外が発生し、止まってしまいました。(デバッグで実行時) エラーの詳細を見ると、「空のDataGridViewに行を追加することはできません」 と書いてありました。 仕方なく列を追加する形にしようとしても、CellsがDataGridViewColumnにはないからImageCellをColumnにAddできないし、困っています。 どうすればよいでしょうか?

みんなの回答

  • skp026
  • ベストアンサー率45% (1011/2238)
回答No.1

以下は参考になると思います。 http://dobon.net/vb/dotnet/datagridview/index.html おそらくは、描画や列追加のタイミングを理解する、 ということが必要と考えます。 それに直結するサンプルを見つける手間はかかると思いますが、 まずはサンプル単体で動作確認したり修正するなど 頑張ってみてください。 (今手元に環境が無いので、こちらで試したりできずごめんなさい。)

blacknike94
質問者

お礼

ご回答ありがとうございました。 サイトを確認してみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

    C# DataGridViewにデータを追加したい。 追加ボタンでDataGridViewにデータを挿入したいのですが、うまくいきません。 DataGridViewRowCollection.Add(new Object[] { 7, 777, 777, 777 }); などとしてみたのですが、オブジェクトがありませんとエラーしてしまいます。 dataGridView1.DataGridViewRowCollection.Add(new Object[] { 7, 777, 777, 777 }); としてみてもエラーが出てしまいます。 1行だけ新規にデータを挿入したい場合はどの様に記述すれば良いのでしょうか? アドバイスよろしくお願いいたします。

  • 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

  • DataGridViewについて

    Fom1のDataGridViewから選択した行のデータをForm2のDataGridViewに渡し、Form2で編集しFom1に反映せると、どの行のデータも1行目に入ってしまいます。 どのようなコードで解決できますか? 【Form1】 private void DataGridView1_SelectedRowsDoubleClick(Object sender, MouseEventArgs e) { // Form2を作成し、親フォームとしてForm1を設定する Form2 f2 = new Form2(); f2.Owner = this; // 親フォームを設定 // 選択行のデータを渡す f2.SetRowData(dataGridView1.SelectedRows, dataGridView1); // Form2を表示する f2.Show(); } /// <summary> /// 選択行のデータを更新するメソッド public void UpdateSelectedRowData(int rowIndex, string editedData1, string editedData2, string editedData3) { // データソースが DataTable の場合のみ処理を実行する if (dataGridView1.DataSource is DataTable dt && dt.Rows.Count > rowIndex) { // データ行を取得する DataRow dataRow = dt.Rows[rowIndex]; // 編集データを新しいデータ行にセットする dataRow["date"] = editedData1; dataRow["name"] = editedData2; dataRow["week"] = editedData3; } } } } 【Form2】 public void SetRowData(DataGridViewSelectedRowCollection rows, DataGridView dataGridView)  { //データテーブルの作成 DataTable dt = createData(); foreach (DataGridViewRow r in rows) { //1列目~3列目を取り出す string s1 = r.Cells[1].Value.ToString(); // 日付 string s2 = r.Cells[2].Value.ToString(); // 名前 string s3 = r.Cells[3].Value.ToString(); // 曜日 dt.Rows.Add("2023年", s1, s2, s3); //日付順に昇順に表示する dt.DefaultView.Sort = "日付 ASC"; } //一覧を表示する dataGridViewDisp2(dt); } // 編集後のデータを保持するためのプロパティ public string EditedData1 { get; set; } public string EditedData2 { get; set; } public string EditedData3 { get; set; } /// 更新ボタンの処理 private void savebtn_Click(object sender, EventArgs e) { // 親フォーム Form1 をForm1に指定する Form1 form1 = this.Owner as Form1; if (form1 != null) { // Form1のDataGridViewのデータソースを取得する DataTable dt = form1.dataGridView1.DataSource as DataTable; if (dt != null) { // dataGridView2の各行を処理する foreach (DataGridViewRow row in dataGridView2.Rows) { // 新規行はスキップする if (row.IsNewRow) continue; // 編集されたデータを取得する string editedData1 = row.Cells[1].Value.ToString(); string editedData2 = row.Cells[2].Value.ToString(); string editedData3 = row.Cells[3].Value.ToString(); // 選択された行のインデックスを取得する int rowIndex = row.Index; // 親フォーム Form1 の UpdateSelectedRowData メソッドを呼び出す form1.UpdateSelectedRowData(rowIndex, editedData1, editedData2, editedData3); } } } // 現在のフォームを閉じる this.Close(); } } }

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

  • DataGridViewに関して

    開発:Visual Basic 2008 考え方の質問になってしまうかもしれませんが教えて下さい。 Datagridviewを用いて、データの入力をさせたいと考えています。 但し、入力だけでなく画面にある表示ボタンを押した際には、テーブルに格納されている データを検索しに行き、その内容を表示させたいと考えています。 Datagridviewはフォームに貼り付け、各項目を一つずつ作成してあります。 しかし、この場合、以下のような記述をすると(そもそも記述が違うかと思われますが・・・)、 もともと作成してある項目(列)にデータがセットされず、新規で列を作ってしまいます。 《記述内容》 '変数の宣言 Dim dtSet As DataSet = New DataSet("PRODUCTS") Dim dtTable As DataTable 'データセットにテーブルを追加する dtTable = dtSet.Tables.Add("A_TBL") 'テーブルにフィールドを追加する '.Add("フィールド名", フィールドの型)で追加します dtTable.Columns.Add("AAA", Type.GetType("System.String")) Dim data_row As DataRow = dtTable.NewRow() data_row("AAA") = PIN_AAA dtTable.Rows.Add(data_row) 'DataGridにデータを表示する G_BBB.DataSource = dtSet.Tables(0) そもそもDatagridviewを用いて、入力や表示を行うにはどのような形にするのが 良いのでしょうか? Datasetとか使う? 教えて頂きたいと思います。 よろしくお願いします。

  • DataGridViewで教えてください。

    DataGridViewで教えてください。 VB初心者ですが どうかよろしくお願いいたします。 VB2005で DataGirdView(dgv1)の始めの行を 他のDataGridView(dgv2)に追加したいのですが、 うまくいきません。 どうすればよいのでしょうか? すみませんが、 教えてください。 よろしくお願いします。 Dim Table As DataTable Dim MainTable As DataTable Dim row As DataRow Table = DirectCast(dgv1.DataSource, DataTable) MainTable = DirectCast(dgv2.DataSource, DataTable) row = MainTable.NewRow row = Table.Rows(0) MainTable.Rows.Add(row)

  • 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# .NET DataGridView の行を追加するとデータが消える。

    すぐ下に先ほど書いた質問がありますが、こちらに難点か追記してあります。下の質問は後ほど消します。(何でか、今現在消せないそうなので。) 環境 WindowsXP SP2 VisualStudio.NET 2005 C# テストプログラムで、こんなコードを書きました。 private void button1_Click(object sender, EventArgs e) { int iMaxCnt; dataGridView1.Rows.Add(1); iMaxCnt = dataGridView1.RowCount ; dataGridView1.EndEdit(); dataGridView1.Rows[iMaxCnt-1].Cells[0].Value = "たちつてと"; dataGridView1.Rows[iMaxCnt-1].Cells[1].Value = "なにぬめの"; dataGridView1.Rows[iMaxCnt-1].Cells[2].Value = "はひふへほ"; dataGridView1.EndEdit(); } ボタンのクリックイベントなので、これを何度か実行すると、DataGridView の一番下の行だけにデータが表示されてしまいます。(以前のボタン押下時に記入されたデータが消えてしまい、データの変更が確定されていないように見えます。) なぜなんでしょう?

  • [C#] DataGridViewでコンボボックスでの変更がdataTableに反映されません

    DataGridViewへのコンボボックス利用で躓いております。 DataGridViewのAutoGenerateColumnsをfalseにし、dataGridView.DataSourceにデータベースから読み込んだデータテーブルを指定しています。 次にdataGridViewにDataGridViewComboBoxColumnを追加し、DataPropertyNameにコンボボックスに対応させたい データテーブルのCaptionを指定することで、データテーブルとコンボボックスを関連付けています。 実行後の表示は想定通りなのですが、コンボボックスでアイテムを選択するとdataGridView上では値が更新されて、データテーブルには変更が反映されていません。 ちなみにコンボボックスでは、ValueMemberとDisplayMemberを設定し、DataGridView上ではstring、 内部的にはlongでデータ管理を行いたいと思っています。 どうにも解決方法が見いだせないので、こちらに質問させていただきました。 ソースを貼りつけるのでご指摘をお願いします。 利用しているデータベース |ID|ペットID| |1 |1| |2 |1| |3 |3| 以下ソースでは上記データベースのデータテーブルをpdtとしています。 コンボボックスのデータテーブル作成 DataTable comboTable = new DataTable(); comboTable.Columns.Add("ID", typeof(long)); comboTable.Columns.Add("NAME", typeof(string)); string[,] rowDataArray =      {{"1", "犬"},      {"2", "猫"},      {"3", "魚"}}; for(i=0;i<rowDataArray.GetLength(0);i++) {    DataRow row = comboTable.NewRow();    row["ID"] = rowDataArray[i, 0];    row["NAME"] = rowDataArray[i, 1];    comboTable.Rows.Add(row); } comboTable.AcceptChanges(); //コンボボックスを作成しコンボボックステーブルをバインド DataGridViewComboBoxColumn cbc = new DataGridViewComboBoxColumn(); cbc.DataSource = comboTable; cbc.DisplayMember = "NAME"; cbc.ValueMember = "ID"; cbc.DataPropertyName = pdt.ペットIDColumn.Caption; cbc.DisplayStyleForCurrentCellOnly = true; //dataGridViewにデータテーブルをバインド dataGridView1.AutoGenerateColumns = false; dataGridView1.DataSource = pdt; dataGridView1.Columns.Add(cbc); これを実行すると |犬| |犬| |魚| とdataGridViewに表示され、コンボボックスでは、犬、猫、魚が選べます。 一行目において、コンボボックスから猫を選択するとdataGridViewは下記のようになるのですが |猫| |犬| |魚| この後ブレークよりデータテーブルとdataGridViewを見ると pdt[0][0] = 1 dataGridView1.Rows[0].Cells[0].Value = 2 となっており、dataGridViewの値は更新されているのに、データテーブルでは更新されていませんでした。 今まで、dataGridView上でダブルクリックし、値を直接書き換えていたらデータテーブルの値も更新されていたのですが、 コンボボックスを使うようにしたら更新されなくなりました。 皆様、解決方法を教えていただけますでしょうか。

  • DataGridViewのデータをComboBoxの項目に追加する

    回答お願い致します。 現在、VB2005を勉強していてDataGridViewを学んでいます。 DataGridViewの項目に(教員番号,教員名)とあるとして、教員名のデータをComboBoxの項目に追加したいと考えています。 普通に項目を追加するのなら、 For intLoop = 0 To DataGridView.Rows.Count - 1 ComboBox.Items.Add(DataGridView.Rows(intLoop).Cells (1).Value) Next といった感じで出来るのですが、これだと教員名が重複している場合も全てComboBoxに項目を追加してしまうので、それを避けて項目を追加する良い方法はないでしょうか?

このQ&Aのポイント
  • 特定のサイトの閲覧ができない問題が発生しています。試したブラウザや常駐ソフトの無効化などでも解決しませんでした。
  • EdgeやChrome、Firefoxなど様々なブラウザで特定のサイトを開こうとしても閲覧できません。
  • NEC 121wareの問題かと思いましたが、それも関係なく特定のサイトにアクセスできない状態です。
回答を見る