🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VB.NET

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

Q&A

解決済

1回答

1671閲覧

DataGridViewの行追加時、前行の特定セル値を追加した行にもセットしたい

mahry

総合スコア37

VB.NET

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

0グッド

0クリップ

投稿2019/12/05 07:38

編集2019/12/05 08:33

11月からVB.NET触り始めました。

前提・実現したいこと

DBから持ってきたデータをDataGridViewにセットして表示しているのですが、
そこに新しい行を「画面上で追加」操作したとき、前行の特定のセルに入っている値をその新しく追加した行の特定セルにセットしたいです。

例)

IDNAMECLASS
0001NIC1J
0002EDGAR1J
0003GEORGE2J
0004ALFRED3J
3J

最終行が新規に追加する行。
このとき、前行のCLASSセル「J3」が新規追加した行の同じセルにセットされるようにしたいです。
行の追加は、画面に「+行追加」のボタンを用意して、クリックするたびに新規行が追加されるようにしたいです。

現在の進捗

ボタンを押したら新規行が追加される、というところまでは実装しました。

該当のソースコード

VB.NET

1 Private Sub NewRowsButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewRowsButton.Click 2 Dim dr As DataRow = ClassList.NewRow 3 ClassList.Rows.Add(dr) 4 End Sub

試したこと

VB.NET

1 Private Sub NewRowsButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewRowsButton.Click 2 Dim dr As DataRow = ClassList.NewRow 3 dr("CLASS") = "J3" 4 ClassList.Rows.Add(dr) 5 End Sub

上記のようにすると行追加時にCLASSセルに「J3」と出るのですが、当然前行が必ず「J3」になるとも限らないのでダメでした。

追加の疑問

新規追加した行を削除するとき、

VB.NET

1 Private Sub DeleteRowsButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DeleteowsButton.Click 2 Try 3 'DataGridView = mrs 4 Dim ClassData As DataTable = CType(mrs.DataSource, DataTable) 5 6 For i As Integer = 0 To ClassData.Rows.Count - 1 7 'celCHECKは選択ボックスです。未選択で「0」 選択すると「1」に変わります 8 If ConvertInt32(ClassData.Rows(i)("CHECK")) = 0 Then Continue For 9 10 ClassData.Rows.RemoveAt(i) 11 12 Next 13 14 Catch ex As Exception 15 m_objLogFunc.WriteExceptionLog(ex) 16 Finally 17 '強制的に画面に戻る 18 getMenuBar() 19 End Try 20 End Sub

このように削除処理を入れているのですが、
例えば5行分データがあるとき、3行目(Rows(2))を削除する際に「5行目(Rows(4))に行がない」ということで突き返されてしまいます。
削除後「i -= 1」を入れたらいけるだろうか、と思ったのですがうまくできませんでした。新規行追加と合わせて、もし良いアドバイスがあれば賜りたいと思います。
よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/12/05 21:50

全体的にどのような構成になっているのでしょう? Visual Studio のデータソース構成ウィザードを使ってアプリを自動生成すると、型付 DataSet/DataTable に BindingSource と BindingNavigator を組み合わせて、それ経由で DataGridView にデータバインドするコードになりますが、そのような構成ですか?
退会済みユーザー

退会済みユーザー

2019/12/06 02:19

データソース構成ウィザードを使って作ることをお勧めします。勉強のために使わないで作ってみるというのは良いかもしれませんが、その前に基本はどういうものかを知っておいた方がよさそうです。
guest

回答1

0

ベストアンサー

手っ取り早く前最終行の値を取得したいなら、こんな感じでしょうか?
(ClassListが空である場合はそれなりの対策をしてください。)

VB

1 Dim drLast As DataRow = ClassList.Rows(ClassList.Rows.Count - 1)) 2 Dim className As String = drLast("CLASS") 3 Dim dr As DataRow = ClassList.NewRow 4 dr("CLASS") = className 5 ClassList.Rows.Add(dr)

追加の疑問への回答

本当は、別の質問としてスレッドを立てた方がよいと思いますが、ここで追加の疑問にお答えします。
For i = 0 To...~Nextの中でClassData.Rows.RemoveAt(i)のような行削除はお勧めできません。
ループ内でClassData.Rows.RemoveAt(i)を行うと、除かれたDataRowの分だけインデックスがズレます。
これにより、場合によってはRows(i)のDataRowが意図したものと異なるDataRowである恐れがあります。
また、ループで「For i As Integer = 0 To ClassData.Rows.Count - 1」と定義した場合、ループの途中でClassData.Rows.Countの値が変化しても、iの上限がループ開始時のまま固定になってしまうと思います。
これが「5行目(Rows(4))に行がない」エラーの理由だと思います。

対応策は色々とあるのですが、もし、今のコードを流用したいのであれば、
「For i As Integer = 0 To ClassData.Rows.Count - 1」の代わりに、
「For i As Integer = ClassData.Rows.Count - 1 To 0 Step -1」
のように行を逆方向から評価することです。
これならDataRowの抜けによるズレは気にしなくて済みます。

投稿2019/12/05 08:06

編集2019/12/06 01:03
kenshirou

総合スコア772

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

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

mahry

2019/12/05 10:03

回答ありがとうございます! これで一度試してみようと思います!
kenshirou

2019/12/06 01:39

一応、追加の疑問に対しても回答しました。 本当は、DataGridView側で削除とか、そういうことがしたいのかなとも思いましたが、とりあえずは一般的な考え方として、回答しました。
mahry

2019/12/06 01:44

エラー理由と現行コードの指摘点だけでなく対応策まで教えていただき、とても助かりました。逆方向からの評価で上手くいきました。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問