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

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

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

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

Q&A

解決済

4回答

1854閲覧

C# datagridviewのチェックボックスに削除機能を追加したい。

bjjdai

総合スコア7

C#

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

0グッド

1クリップ

投稿2019/08/02 23:20

編集2019/08/03 05:37

プログラミングの超初心者です。
C#を使用し、TODOアプリ(完了、期限、やることを管理する最低限のもの)を作成しようとしています。
datagridviewにチェックボックスまでは何とかつけられたのですが、
チェックを付けた行を削除する際に、ある程度コードは調べましられましたが、
そもそも機能追加する場合に、コードをどこから入力すればいいかがわかっておりません。
欲を言えば、タスクを保存するコードも入力したいです。
何卒ご教示願います。

エラーメッセージ
enptyステートメントが間違っている可能性があります。

該当のソースコード

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn(); dataGridView1.Columns.Add(column); for (int i = 0; i < dataGridView1.RowCount; i++) ; if (Convert.ToBoolean(new DataGridViewCheckBoxColumn())); } public class MyButton : Button { } private void 登録_Click(object sender, EventArgs e) { int Row = this.dataGridView1.Rows.Add(); this.dataGridView1.Rows[Row].Cells[1].Value = DateTimePicker1.Value.ToString(); this.dataGridView1.Rows[Row].Cells[2].Value = textBox1.Text; } private void DateTimePicker1_ValueChanged(object sender, EventArgs e) { } private void TextBox1_TextChanged(object sender, EventArgs e) { } private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { Convert.ToBoolean(dataGridView1.Rows[1].Cells[0].Value); } private void 削除_Click(object sender, EventArgs e) { this.dataGridView1.CurrentCell.Value = DBNull.Value; } private void 保存_Click(object sender, EventArgs e) { } } }

試したこと

どこから試せばいいかわからないので、ためしていません。

補足情報(FW/ツールのバージョンなど)

VS2019です。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/08/03 00:42

コードは ``` と ``` で囲ってください。インデントされて見やすくなるので。 インデントされてないコードは質問者さん自身も読む気が起きないのでは? 回答者・閲覧者はなおさらです。質問を読んでもらわないと話が始まらないわけですから、読んでもらえる努力をしましょう。
guest

回答4

0

ベストアンサー

今環境が無いので試していませんが。
また、クリックイベントの中で現在の行が削除されるかわかりませんが。

編集

C#

1public partial class Form1 : Form 2 { 3 private DataTable da = new DataTable(); 4 private DataColumn col; 5 private DataRow row; 6 public Form1() 7 { 8 InitializeComponent(); 9 } 10 11 private void Form1_Load(object sender, EventArgs e) 12 { 13 DataGridColumn(); 14 } 15 16 private void DataGridColumn() 17 { 18 col = new DataColumn(); 19 col.ColumnName = "チェック"; 20 col.DataType = Type.GetType("System.Boolean"); 21 da.Columns.Add(col); 22 23 col = new DataColumn(); 24 col.ColumnName = "日付・時刻"; 25 col.DataType = Type.GetType("System.String"); 26 da.Columns.Add(col); 27 28 col = new DataColumn(); 29 col.ColumnName = "内容"; 30 col.DataType = Type.GetType("System.String"); 31 da.Columns.Add(col); 32 33 dataGridView1.DataSource = da; 34 dataGridView1.AllowUserToAddRows = false; 35 dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 36 } 37 38 private void 登録_Click(object sender, EventArgs e) 39 { 40 if (textBox1.Text != "") 41 { 42 row = da.NewRow(); 43 row["チェック"] = false; 44 row["日付・時刻"] = dateTimePicker1.Value.ToString(); 45 row["内容"] = textBox1.Text; 46 da.Rows.Add(row); 47 } 48 else 49 { 50 MessageBox.Show("テキストボックスに入力されていません。"); 51 } 52 } 53 54 private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 55 { 56 57 } 58 59 private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 60 { 61 if (Convert.ToBoolean(dataGridView1.CurrentRow.Cells["チェック"].Value)) 62 { 63 //現在の列のチェクボックスがtrueの時、現在の行を削除 64 dataGridView1.Rows.RemoveAt(dataGridView1.CurrentCell.RowIndex); 65 } 66 67 //チェックボックスをクリック後、すぐに削除するにはこれが必要 68 if (dataGridView1.CurrentCellAddress.X == 0 && dataGridView1.IsCurrentCellDirty) 69 { 70 dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 71 } 72 } 73 }

でも、これって間違えてクリックした場合でも確認もなしで削除されますので何か対応をとった方が良いと思います。

投稿2019/08/03 06:05

編集2019/08/03 11:17
shinami

総合スコア334

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

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

bjjdai

2019/08/03 06:23

shinami様 ご回答ありがとうございます。 確かに確認無しでも消えてしまいますね。そこまで考えていませんでした。
shinami

2019/08/03 11:18

後は適当に編集してください。
bjjdai

2019/08/04 01:00

何とか形になりました。ご教示ありがとうございました。
guest

0

部分的なことしか書いてないので、質問者さんのやりたいことの全体が不明ですが、たぶん、SQL Server などの DB のテーブルのレコード一覧を Windows Forms アプリで DataGridView に表示し、ユーザーがそれを見て編集し、その結果で DB のテーブルに更新をかけるということではなかろうかと想像しています。

その想像が当たっているとすると、今やっていることではなかなかゴールにはたどり着けないと思われます。

DataGridView などを UI として非接続型のデータ更新を行う場合は、

DataGridview ⇔ BindingSource / BindingNavigator ⇔ DataSet / DataTable ⇔ DataAdapter⇔ SQL Server

・・・と言う構造にするのが普通です。

何故かと言うと・・・

以下の記事の「非接続型のデータ更新」のセクションの図1と図2を見てください。

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

上のような構造にすれば、ユーザーが DataGridView を操作した結果は図1にあるように DataSet / DataTable に反映されます。もちろん削除の結果もです。

編集作業が終了後、ユーザーが更新ボタンをクリックすれば、図2のように DataAdapter によって SQL が自動発行され、SQL Server のテーブルが更新されます。

DB が SQL Server の場合ですが、以下のチュートリアル、

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、上に書いた、

DataGridview ⇔ BindingSource / BindingNavigator ⇔ DataSet / DataTable ⇔ DataAdapter⇔ SQL Server

・・・と言う構造、すなわち以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

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

上に紹介したチュートリアルは 2 つのテーブルを階層更新するために少々複雑になっていますが、単一テーブルですともっと簡単で、操作に慣れると以下のようなアプリが 5 分もかからず作れるはずです。

イメージ説明

削除は、上の画像で、削除する行を選んで×マークのアイコンをクリックするだけで DataGridView からその項目が消えて、内部の DataTable には図1でいう Deleted マークがつきます。その後、フロッピーディスクのアイコンをクリックすれば SQL Server のテーブルに削除を含む編集結果が反映されます。

自力で一からコードを書く場合のような種々の問題に悩むことはなくなり、開発工数は激減するはずです。保守工数も減るはずです。お試しください。

投稿2019/08/03 01:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bjjdai

2019/08/03 01:52

SurferOnWww様。ご指摘ありがとうございます。 かなり細かく解説いただけているようでありがたいのですが、 ちょっと難解で、、 datagridviewはSQLServerのDBではなく、 ユーザーがプログラム上で直接入力編集する仕組みでと考えおります。 ・付けたい機能 ①datagridviewのタスクに期限とやることを登録ボタンで登録(済み)、 ②対象の行を削除ボタンで削除(済み)、 ③期限が過ぎた項目(行)は✓boxで削除する、 ④一連の登録した内容を保存ボタンで保存(textまたはxml)。 でと考えております。
退会済みユーザー

退会済みユーザー

2019/08/03 02:05

> datagridviewはSQLServerのDBではなく、ユーザーがプログラム上で直接入力編集する仕組みでと考えおります。 そういう場合でも DataSet / DataTable を使うことをお勧めします。 > ④一連の登録した内容を保存ボタンで保存(textまたはxml) ということであれば、DataGridView ⇔ BindingSource ⇔ DataSet ⇔ XML ファイル・・・という構造にするのがよさそうです。具体的には以下の記事のような感じです。 XML ファイルを DataGridView に表示 http://surferonwww.info/BlogEngine/post/2019/04/26/show-content-of-xml-file-on-datagridview.aspx
退会済みユーザー

退会済みユーザー

2019/08/03 02:34

質問へのコメント欄で頼んだ「コードは ``` と ``` で囲ってください」の件、ちゃんとやってください。無視は NG
bjjdai

2019/08/03 02:46

SurferOnWww様すみません。インデント囲いました。 リンクの記事試してみます
退会済みユーザー

退会済みユーザー

2019/08/03 02:50

直ってませんけど? 「コードは ``` と ``` で囲ってください」の ``` はバッククォート 3 個です。以下のようにするのです。 ``` ソースコードの一行目 ・・・ ・・・ ソースコードの最後の行 ``` コメント欄では ``` で囲っても反映されませんが、質問欄や回答欄ではインデントされます。
bjjdai

2019/08/03 03:04

実施しましたが、これでよろしいでしょうか?
退会済みユーザー

退会済みユーザー

2019/08/03 03:14

違います。シングルクォート 3 つ ''' ではなくバッククォート 3 つ ``` です。囲い方は上に書いた通り、 ``` ソースコードの一行目 ・・・ ・・・ ソースコードの最後の行 ``` どこが分からないのか不思議です。
YAmaGNZ

2019/08/03 04:32

バッククォートが分からなければ、編集エリアの上のところに<code>のボタンがあるので、それを押してコードと書かれた部分にご自身のソースを書いてください。
bjjdai

2019/08/03 05:21

すみません、再度囲いなおしました。
退会済みユーザー

退会済みユーザー

2019/08/03 05:29

まだ直ってません。コードの中の一部を囲うのではなく、コードの一番最初の行 using System; の直前に ``` を割り込ませて、コードの一番最後の } の直後に ``` 割り込ませるのですよ。上にそう書いたつもりですが分かりませんでした?
bjjdai

2019/08/03 05:38

今のご説明で囲いました。 今度こそいかがでしょう?
退会済みユーザー

退会済みユーザー

2019/08/03 05:52

今度はよさそうです。対応いただきありがとうございました。
bjjdai

2019/08/03 05:54

何度もご説明いただきありがとうございます。
guest

0

public Form1() { InitializeComponent(); DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn(); dataGridView1.Columns.Add(column); for (int i = 0; i < dataGridView1.RowCount; i++) ; if (Convert.ToBoolean(new DataGridViewCheckBoxColumn())); }

上記の部分の

for(int i = 0;i < dataGridView1.RowCount; i++);
if (Convert.ToBoolean(new DataGridViewCheckBoxColumn()));
これらは ここには 必要ないと思います。

削除するには

private void 削除_Click(object sender, EventArgs e) { this.dataGridView1.CurrentCell.Value = DBNull.Value; //ここに、行を削除する命令を書く }

追記
よく見てみると色々問題ありそうな感じですね。
実行させてみましたか?

投稿2019/08/03 00:15

編集2019/08/03 00:24
k.matsuda

総合スコア293

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

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

bjjdai

2019/08/03 00:29

k.matsuda様ご回答ありがとうございます。 また、アドバイスありがとうございます。 private void 削除_Click(object sender, EventArgs e) { this.dataGridView1.CurrentCell.Value = DBNull.Value; //ここに、行を削除する命令を書く } ですが、すでに削除ボタンを備えております。 ここではなく、✓BOXでも削除できるようにしたいのです。
bjjdai

2019/08/03 00:35

k.matsuda様 実行すると "System.Windows.Forms.DataGridViewCheckBoxColumn' のオブジェクトを型 'System.IConvertible' にキャストできません。" で途中で中断されます。
k.matsuda

2019/08/03 00:55

チェックボックスをチェックしたら即座に削除するのでしょうか? そうではなくて、いくつかをチェックしておいて削除ボタンで削除するのかと思いましたが。 回答に書いてある、for文とif文をコメントアウトして実行させてみてください。
bjjdai

2019/08/03 01:41

✓BOXで即座に削除したいと考えております。削除ボタンとは別に すみません無知なもので、コメントアウトがよくわからないのですが。
k.matsuda

2019/08/03 01:52

ググれば出てきますが、コードの一部を一時的にコメントとしてしまうことです。 まあ、//をつければ良いだけです。 `//for(int i = 0;i < dataGridView1.RowCount; i++);`
k.matsuda

2019/08/03 01:57

即座に削除・・・というのであれば、わざわざチェックボックスにしなくてもいい気がしますが・・・。 どうせチェックしてもすぐ消えるので。
bjjdai

2019/08/03 01:57

削除ボタン自体は、currentcellで削除できるようにしています。
k.matsuda

2019/08/03 02:02

んー。その辺も問題ありそうですがね。 まあ、この質問とは別の案件になるのでここでは言及しません。
bjjdai

2019/08/03 02:03

確かにおっしゃる通りなのですが、できるか試してみたいので、、、 コメントアウトで実行はできるようになりました。 ✓BOXは✓がつくだけです。
k.matsuda

2019/08/03 02:23

セルの内容が変わって、フォーカスが抜けると Cell​Value​Changedイベントが発生しますので、そこで削除すればよろしいかと。
bjjdai

2019/08/04 01:01

何とか形になりました。ご教示ありがとうございました
guest

0

投稿2019/08/02 23:28

YAmaGNZ

総合スコア10258

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

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

bjjdai

2019/08/02 23:37

YAmaGNZ様 ご回答ありがとうございます。 参考にして入力してみたのですが、どうもうまくいきません。おそらくコードの入力部分が間違っているかと思いますが、、 コードの部分は以下の通りになります。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn(); dataGridView1.Columns.Add(column); for (int i = 0; i < dataGridView1.RowCount; i++) ; if (Convert.ToBoolean(new DataGridViewCheckBoxColumn())); }
YAmaGNZ

2019/08/03 01:44

何がどううまくいかないのか説明できるようにしてください。 例えば、○○というエラーがこの行で発生して実行できないとか ただコードを見せられてうまくいかないと言われてもデバッグ依頼でしかありません。
bjjdai

2019/08/03 03:05

すみません。ちょっと整理します。
bjjdai

2019/08/04 01:02

何とか形になりました。ご教示ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問