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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

23186閲覧

DataGridView内のCheckBoxに対しての全選択・全削除をしたい

yyy

総合スコア49

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/07/26 08:29

編集2016/07/26 08:30

VB.NETのWindows Formで、DataGridView内のCheckBoxに纏めてチェックを付けたり解除したり(全選択・全解除)をしたい。

Form配置コントロール
・DataGridView←この中身はバインドしたMDBファイル
・削除Button
・全選択Button
・全解除Button

散々調べたのですが、どうもうまくコードが書けません。

また、
ループで回すのではなく、
チェックがついている行だけを選択取得するような形を目指しています。

◎教えていただきたいこと

・DataGridViewのCheckBoxに対しての全選択・全削除のやり方
(考え方も含め教えていただけると非常に嬉しいです。)

・チェック該当項目のみを取得する方法

以下サイトを参考にして、なんとなく必要なことはわかったような気がしているのですが、自力では厳しそうです…。
http://www.atmarkit.co.jp/fdotnet/dotnettips/521dgvselectedcells/dgvselectedcells.html

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

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

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

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

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

guest

回答1

0

ベストアンサー

①「選択されている~」について
提示いただいたサイト内で「選択されているセル」とか「選択されている行」と言われているのは、チェックボックスにチェックが付けられている行とかセルという意味ではありません。
セルのクリックにより「選択状態にあるセル」とか、行ヘッダのクリックにより「選択状態にある行」を指しています。
SelectedRowsコレクションには「選択状態にある行」が格納されているということです。

②ループ処理について
(全選択/全解除の機能に関する制約として記載いただいているのかがわかりませんが、)質問文中に

ループで回すのではなく、チェックがついている行だけを選択取得するような形を目指しています。

と記載いただいています。

これは例えば100行の明細のうち30行がチェックされている場合、
①100行全てをループしてチェック有無の判定をし、チェックされている30行の場合のみ目的の処理を行う
というやり方ではなく、
②100行全てはループせず、チェックされている30行のみをループして目的の処理を行いたい
という解釈でよかったでしょうか?

提示いただいたサイトでは選択行が格納されているコレクション(SelectedRows)を利用して

For Each row As DataGridViewRow in dgv.SelectedRows ' 選択されている個々の行「row」についての処理 Next

のように処理していますが、チェックボックスのON/OFF状態は独自に全件ループして判定してあげる必要があると思います。

少なくとも全選択/全解除については対象が「全て」ですので全体をループする必要があると思います。

投稿2016/07/26 10:58

jawa

総合スコア3013

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

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

yyy

2016/07/29 04:27 編集

お世話になります。遅くなり、申し訳ありません。 自分でも読み返してみたのですが、jawaさんが仰るとおり「全選択・全解除」の際には全行のループが必要ですね…。書き方が非常に悪かったです。申し訳ありません。 これに関しては、以下コードでループさせることにしました(全選択の場合)。 Dim i As Integer For i = 0 To DataGridView1.Rows.Count - 1 DataGridView1(colSELFLG, i).Value = True Next また、「削除」に関してですが、これは件数が多いことが予想されるため、全行をループでいいのか?必要行だけ取得削除することはできないか?と、考えた結果あのような質問になっておりました。 これに関しては以下のようなコードを書いてみたのですが、上から1行ずつしか消えてくれません(ボタン1回押下につき1行削除の状態)。 見る行を選択しないと上から順々にしか見てくれない、ということなのでしょうか? MessageBox.Show("選択したデータを削除してもよろしいですか", "テスト", MessageBoxButtons.YesNo, MessageBoxIcon.Question) If Windows.Forms.DialogResult.Yes Then If DataGridView1(colSELFLG, i).Value = True Then DataGridView1.Rows.RemoveAt(i) End If End If 申し訳ございませんが、教えていただけると幸いです。 よろしくお願いします。
jawa

2016/07/29 08:14

iをループで回していなければ1回の処理になってしまいます。 また、ループで回すのであれば、行番号の大きいほうから回したほうがいいかもしれません。 10行中の1行目と3行目を削除する場合、1行目を削除した時点で以降の行が繰り上げられ、3行目だったデータは2行目に繰り上がります。 なので削除ループは下から行った方が無難なのですが、DataGridViewでもこの点の考慮が必要だったかどうか・・・。 手元にすぐ確認できる環境がなくうろ覚えの記憶で申し訳ないですが、以前対処した覚えがありましたので念のため。
yyy

2016/08/01 00:35

追加でループを入れてみたのですが、削除ボタン自体が反応しなくなりました…。 If Windows.Forms.DialogResult.Yes Then If DataGridView1(colSELFLG, i).Value = True Then For i = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Rows.RemoveAt(i) Next End If End If 確かに、繰り上がると処理が面倒ですね(自分では考えたこともなかったので非常に勉強になります)。 その点に考慮してもう一度調べてみます。 ありがとうございます!
jawa

2016/08/01 01:17

ループするならiを使っている判定文の外側です。 内側でループしてしまうと1件目で条件を満たしたら全行削除することになってしまいますので。 ``` For i = DataGridView1.Rows.Count - 1 To 0 Step -1 If DataGridView1(colSELFLG, i).Value = True Then DataGridView1.Rows.RemoveAt(i) End If Next ```
yyy

2016/08/01 06:44

全然気が付きませんでした…。 ご指摘ありがとうございます。
yyy

2016/08/02 07:11

追加で質問させていただきたいのですが、書いていただいたコードで For i = DataGridView1.Rows.Count - 1 To 0 Step -1 上記の部分、 For i = DataGridView1.Rows.Count To 0 Step -1 これではなぜダメなのでしょうか? ループの最初の値だったらcountの最大行数のような気がしてしまうのですが…。
jawa

2016/08/02 08:02

なぜ `For i = DataGridView1.Rows.Count - 1 To 0 Step -1` というコードにしたかというと、その前のコメントで提示いただいたコードが `For i = 0 To DataGridView1.Rows.Count - 1` だったので、単純に元に逆順でループするよう変更しました。 (元が 0から Row.Count-1までのループだったのを Row.Count-1から 0までのループに変更) ではなぜRows.Countを-1する必要があるのか? 実際の動作で確認していただきたいのですが、例えばグリッドにデータ行が10行存在する場合、Row.Countは10になると思います。 これに対して、行を削除する場合、Rows.RemoveAt(n)は1行目を0としたIndex値を指定すると思います。 ここで最大行数(10)から先頭Index値(0)までループさせてしまっては、11行分処理することになってしまいますよね? このように.Countで取得した行数とIndex値の差を埋めるために、.Count-1としているわけです。 コレクションのループ処理などではよく使われる方法なので、一度使えば「そんなものなんだ」と覚えてしまいますよ(^-^)
yyy

2016/08/02 08:19

度々ありがとうございます! そ、そうでした…。自分で書いておきながら完全に見失っていました。 ご説明いただいたら納得いたしました。 なれるよう努力いたします。 本当にありがとうございました!><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問