実現したいこと
クリック毎にDataGridViewに空の列が追加されないようにしたい。
前提
ここに質問の内容を詳しく書いてください。
VisualStudioでWindowsフォームアプリケーションでTodolistを作っています。
発生している問題・エラーメッセージ
DataGridView内をクリックすると空の列が追加されます。クリックする度に追加されます。
該当のソースコード
C#
public partial class TopForm : Form { SqlConnection conn = new SqlConnection(); SqlCommand cmd = new SqlCommand(); DataGridViewCheckBoxColumn chkDeleteDgvColumn = new DataGridViewCheckBoxColumn(); DataGridViewTextBoxColumn idDgvColumn = new DataGridViewTextBoxColumn(); DataGridViewTextBoxColumn todoDgvColumn = new DataGridViewTextBoxColumn(); DataGridViewTextBoxColumn datetimeDgvColumn = new DataGridViewTextBoxColumn(); DataGridViewTextBoxColumn placeDgvColumn = new DataGridViewTextBoxColumn(); DataGridViewTextBoxColumn whatDgvColumn = new DataGridViewTextBoxColumn(); DataGridViewTextBoxColumn howmuchtimeDgvColumn = new DataGridViewTextBoxColumn(); DataGridViewButtonColumn btnUpdateDgvColumn = new DataGridViewButtonColumn(); public TopForm() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { chkDeleteDgvColumn.HeaderText = "チェック"; idDgvColumn.HeaderText = "番号"; todoDgvColumn.HeaderText = "予定"; datetimeDgvColumn.HeaderText = "日時"; placeDgvColumn.HeaderText = "場所"; whatDgvColumn.HeaderText = "何"; howmuchtimeDgvColumn.HeaderText = "予定時間"; btnUpdateDgvColumn.Text = "編集"; btnUpdateDgvColumn.UseColumnTextForButtonValue = true; btnUpdateDgvColumn.Name = "編集"; if (!dgv.Columns.Contains(chkDeleteDgvColumn)) { dgv.Columns.Add(chkDeleteDgvColumn); } if (!dgv.Columns.Contains(idDgvColumn)) { dgv.Columns.Add(idDgvColumn); } if (!dgv.Columns.Contains(todoDgvColumn)) { dgv.Columns.Add(todoDgvColumn); } if (!dgv.Columns.Contains(datetimeDgvColumn)) { dgv.Columns.Add(datetimeDgvColumn); } if (!dgv.Columns.Contains(placeDgvColumn)) { dgv.Columns.Add(placeDgvColumn); } if (!dgv.Columns.Contains(whatDgvColumn)) { dgv.Columns.Add(whatDgvColumn); } if (!dgv.Columns.Contains(howmuchtimeDgvColumn)) { dgv.Columns.Add(howmuchtimeDgvColumn); } if (!dgv.Columns.Contains(btnUpdateDgvColumn)) { dgv.Columns.Add(btnUpdateDgvColumn); } conn.ConnectionString = "Data Source=localhost;Database=task2;User ID=sa;password=localhost"; try { conn.Open(); cmd.CommandText = "SELECT * FROM Todolist;"; cmd.Connection = conn; using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.HasRows) { int rowNo = 0; while (reader.Read()) { dgv.Rows.Add(new DataGridViewRow()); dgv.Rows[rowNo].Cells[1].Value = reader[0]; dgv.Rows[rowNo].Cells[2].Value = reader[1]; dgv.Rows[rowNo].Cells[3].Value = reader[2]; dgv.Rows[rowNo].Cells[4].Value = reader[3]; dgv.Rows[rowNo].Cells[5].Value = reader[4]; dgv.Rows[rowNo].Cells[6].Value = reader[5]; rowNo++; } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { conn.Close(); } } private void btnAdd_Click(object sender, EventArgs e) { AddForm addForm = new AddForm(dgv); addForm.Show(); } } public partial class AddForm : Form { private DataGridView dgv; SqlConnection conn = new SqlConnection(); SqlCommand cmd = new SqlCommand(); public AddForm(DataGridView dgv) { InitializeComponent(); this.dgv = dgv; } private void btnRegister_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtBox1.Text) || string.IsNullOrEmpty(txtBox2.Text) || string.IsNullOrEmpty(txtBox3.Text) || string.IsNullOrEmpty(txtBox4.Text)) { MessageBox.Show("すべての項目に値を入力してください。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } conn.ConnectionString = "Data Source=localhost;Database=task2;User ID=sa;password=localhost"; try { conn.Open(); cmd.CommandText = @" INSERT INTO Todolist ( date_time, todo, place, what, how_much_time ) VALUES ( @date_time, @todo, @place, @what, @how_much_time )"; cmd.Parameters.AddWithValue("@date_time", dateTimePicker1.Value); cmd.Parameters.AddWithValue("@todo", txtBox1.Text); cmd.Parameters.AddWithValue("@place", txtBox2.Text); cmd.Parameters.AddWithValue("@what", txtBox3.Text); cmd.Parameters.AddWithValue("@how_much_time", txtBox4.Text); cmd.Connection = conn; cmd.ExecuteNonQuery(); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { conn.Close(); } try { conn.Open(); cmd.CommandText = "SELECT * FROM Todolist;"; cmd.Connection = conn; using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.HasRows) { int rowNo = 0; while (reader.Read()) { dgv.Rows.Add(new DataGridViewRow()); dgv.Rows[rowNo].Cells[1].Value = reader[0]; dgv.Rows[rowNo].Cells[2].Value = reader[1]; dgv.Rows[rowNo].Cells[3].Value = reader[2]; dgv.Rows[rowNo].Cells[4].Value = reader[3]; dgv.Rows[rowNo].Cells[5].Value = reader[4]; dgv.Rows[rowNo].Cells[6].Value = reader[5]; rowNo++; } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { conn.Close(); } this.Close(); } }
試したこと
CellClickイベントで何の動作もしないようにするコードを書いてみたが追加された。
補足情報(FW/ツールのバージョンなど)
Windows 10 の Visual Studio 2022 で Windowsフォームアプリケーション(.NET Framework) Version 4.8 です。
AddForm 側にカラムを追加するコードがあるのでは?

開発環境を質問欄を編集して追記してください。(例: Windows 10 の Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 で作っています・・・とか)
もしかして新規追加行をクリックしているとか?
DataGridView内なら、どこでもクリックすると追加されます。

データソースは SQL Server にあるデータベース task2 のテーブル Todolist で、初期画面ではそのテーブルのレコード一覧を DataGridView に表示し、ユーザーがそれを編集し(追加・削除・更新)、その結果を SQL Server に書き戻せればいいのですか?
であれば、Visual Studio のデータソース構成ウィザードを使ってアプリを作ることをお勧めします。どうしても自力でコードを書いて作りたいと言うことでなければですが。
それに興味があればやり方を紹介しますので言ってください。
はい。編集(追加・削除・更新)を結果を SQL Server に書き戻せればいいです。
それらを自力でコードを書いて作りたくて、作っていたら空の列が追加される様になった次第です。
データーソース構成ウィザードの事は知っていましたが、今回は自分でコードを書いて作成する主旨でございます。提案して頂きありがとうございます

自力でコードを書きたいという事情は分かりましたが、それでも基本は守るべきと思います。DataGridView に直接書き込むのは悪手です。SQL Server ⇔ DataAdapter ⇔
DataTable ⇔ BindingSource ⇔ DataGridView という構成にしましょう。
分かりました。そちらの構成で実装してみよようと思います。ご教授いただきありがとうございました。

回答1件
あなたの回答
tips
プレビュー