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

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

新規登録して質問してみよう
ただいま回答率
85.48%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

839閲覧

クリック毎にDataGridViewに空の列が追加される。

kygo

総合スコア1

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2023/03/31 08:16

編集2023/03/31 15:30

実現したいこと

クリック毎に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 です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOZ6.0

2023/03/31 09:21

AddForm 側にカラムを追加するコードがあるのでは?
退会済みユーザー

退会済みユーザー

2023/03/31 09:28

開発環境を質問欄を編集して追記してください。(例: Windows 10 の Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 で作っています・・・とか)
YAmaGNZ

2023/03/31 09:54

もしかして新規追加行をクリックしているとか?
kygo

2023/03/31 15:32

DataGridView内なら、どこでもクリックすると追加されます。
退会済みユーザー

退会済みユーザー

2023/03/31 21:44

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

2023/04/01 00:03

はい。編集(追加・削除・更新)を結果を SQL Server に書き戻せればいいです。 それらを自力でコードを書いて作りたくて、作っていたら空の列が追加される様になった次第です。 データーソース構成ウィザードの事は知っていましたが、今回は自分でコードを書いて作成する主旨でございます。提案して頂きありがとうございます
退会済みユーザー

退会済みユーザー

2023/04/01 00:16 編集

自力でコードを書きたいという事情は分かりましたが、それでも基本は守るべきと思います。DataGridView に直接書き込むのは悪手です。SQL Server ⇔ DataAdapter ⇔ DataTable ⇔ BindingSource ⇔ DataGridView という構成にしましょう。
kygo

2023/04/01 00:36

分かりました。そちらの構成で実装してみよようと思います。ご教授いただきありがとうございました。
guest

回答1

0

ベストアンサー

質問欄の下のコメント欄でのやり取りで、

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

分かりました。そちらの構成で実装してみよようと思います。

・・・とのことでしたので、

Windows Forms アプリで SQL Server などのデーターベースを操作する場合の基本は以下の記事の図の構成です。データーソース構成ウィザードを使わないで自力でコードを書きたいということですが、その場合は上の記事の図で TableAdapter に代えて SqlDataAdapter を使うことになります。

Windows フォーム アプリケーションでのデータへの接続
https://docs.microsoft.com/ja-jp/previous-versions/wxt2cwcc(v=vs.120)

そうするとどういうことが可能になるかというと、以下の記事の「非接続型のデータ更新」のセクションの図1と図2を見てください。文章は読まなくてもいいので図だけ見てください。

DB 設計者のための明解 ADO.NET 第 1 回
https://docs.microsoft.com/ja-jp/previous-versions/cc482903%28v=msdn.10%29

図2の DataSet (中に DataTable がある) の左側に BindingSource / BindingNavigator 経由で DataGridView が接続されていると思ってください。

ユーザーが DataGridView を操作(行の削除・追加・訂正)した結果は図1にあるように DataSet / DataTable に反映されます。ユーザーの編集操作が終わったら Update メソッドで図1の編集結果が一度に DB に反映されます。そういうアプリが簡単に作れるようにできているのです。

今回の問題「クリック毎にDataGridViewに空の列が追加される」に悩まされることもありません。

投稿2023/04/01 00:59

編集2023/04/01 03:58
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問