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

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

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

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

Q&A

1回答

4229閲覧

vb.netのvalueについて

Hamada-hiro

総合スコア6

VB.NET

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

0グッド

0クリップ

投稿2020/12/09 00:58

編集2020/12/09 02:06

vb.netでのDataGridViewについて質問です。

Value内が{}だった時の意味とif文で判定させる方法を教えて下さい。

DataGridViewでのセルで空白だった場合セル内のValueの値がnothing だったり、DBNullと表示されてきました。しかし現在セルを不必要に増やしたところ、Valueの値が{}様な物が入っていました。if文でDBNullだったりNothingだったらループを抜けようとしましたが、反応しません。

Value内が{}だった時の意味とif文で判定させる方法を教えて下さい。

vb.net

1While i < row 2 If dgv.Rows(i).Cells(0).Value Is Nothing Then 3 4 Exit While 5 6 ElseIf dgv.Rows(i).Cells(0).Value Is DBNull.Value And dgv.Rows(i).Cells(3).Value Is DBNull.Value Then 7 8 MessageBox.Show("日付と金額が入力されていない為、保存できませんでした。", "日付と金額が入力されておりません。", MessageBoxButtons.OK, MessageBoxIcon.Error) 9 Exit Sub 10 11 ElseIf dgv.Rows(i).Cells(0).Value Is DBNull.Value Then 12 13 MessageBox.Show("日付が入力されていない為、保存できませんでした。", "日付が入力されておりません。", MessageBoxButtons.OK, MessageBoxIcon.Error) 14 Exit Sub 15 16 ElseIf dgv.Rows(i).Cells(3).Value Is DBNull.Value Then 17 18 MessageBox.Show("金額が入力されていない為、保存できませんでした。", "金額が入力されておりません。", MessageBoxButtons.OK, MessageBoxIcon.Error) 19 Exit Sub 20 21 End If 22 23 i += 1 24 End While

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/12/09 01:17

XY 問題のような気がします。Y だけでなく X (そもそものやりたいこと) を書いてもらうとより的確な解決策が提案されるかもしれません。
Hamada-hiro

2020/12/09 01:20

XYとは何でしょうか? 座標でしょうか?
退会済みユーザー

退会済みユーザー

2020/12/09 01:23

聞く前にググるなどして自分で調べてはいかが?
YAmaGNZ

2020/12/09 01:27

どのような判断をしたのかソースを出せませんか?
Hamada-hiro

2020/12/09 01:33

```vb.net Dim row As Long = dgv.RowCount 'row = row - 1 Dim i As Long = 0 While i < row If dgv.Rows(i).Cells(0).Value Is Nothing Then Exit While ElseIf dgv.Rows(i).Cells(0).Value Is DBNull.Value And dgv.Rows(i).Cells(3).Value Is DBNull.Value Then MessageBox.Show("日付と金額が入力されていない為、保存できませんでした。", "日付と金額が入力されておりません。", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub ElseIf dgv.Rows(i).Cells(0).Value Is DBNull.Value Then MessageBox.Show("日付が入力されていない為、保存できませんでした。", "日付が入力されておりません。", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub ElseIf dgv.Rows(i).Cells(3).Value Is DBNull.Value Then MessageBox.Show("金額が入力されていない為、保存できませんでした。", "金額が入力されておりません。", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If i += 1 End While ```
Hamada-hiro

2020/12/09 01:35

申し訳ございません まだこのサイトを使い慣れていない為、失礼な貼り方をしてしまいました。
dodox86

2020/12/09 01:46

コードは質問文中に追記、編集するかたちで貼ってください。コメント欄ではマークダウン記法(```VB.NET ... ```)は使えません。
Hamada-hiro

2020/12/09 01:48

この処理で実現したい処理は,DataGridViewでのセルの値が空白だった場合メッセージを表示させる事を したいです。 DataGridViewは表として表示されるのですが、表の行の一つの項目にデータが入っている場合、 他の項目が空白だったら空白のセルの値には DBNull型として保存しようとします。 また、自動で新規の行が作成されるのですが、新規の行に何もデータが打ち込まれなければ 新規の行だけ空白のセルの値は Nothingとして保存しようとします。 しかし、不必要な行をいくつか作成し空白のセルの値を見ると{}と表示され、if分のNothingやDBNullでは判定できなくなります。 この{}の意味やif分での判定の仕方を知っている方がいましたらご教授願います。
YAmaGNZ

2020/12/09 01:53

「空白のセルの値を見ると{}と表示され」とありますが、これはどこにどのように表示されているのでしょうか?
Hamada-hiro

2020/12/09 02:00

今回の場合ですとdgv.Rows(i).Cells(0).Valueの値が{}と表示されます。 このセルは日付のデータをしまう箇所なのでDataTime型のセルです。
退会済みユーザー

退会済みユーザー

2020/12/09 02:14

データソースが SQL Server などのデータベースのテーブルで、そのレコード一覧を DataGridView に表示し、ユーザーが DataGridView を見て編集した結果を、元のデータベースのテーブルに反映させるというようなことが X と想像してますが、そうだとすると質問 Y は「ぼくがかんがえたさいきょうのやりかた」的のようにしか思えませんが・・・
Hamada-hiro

2020/12/09 02:15

またプログラムを触っていてきずいた点ですが、空白セルにクリックをし記入をする前にこのプログラムを動かすとデータが入っていないセル、Nothingだった値が{}と変更されていました。これも関係するのでしょうか?
YAmaGNZ

2020/12/09 02:22

DataGridView1.Rows(i).Cells(0).Value.GetTypeとしてどう表示されるか確認してみましょう。
YAmaGNZ

2020/12/09 02:25

データソースが何なのかは不明ですし質問者さんの説明足りてない部分がありますが、何らかのデータソースをDataGridViewに表示して、データの追加などの編集を行い、その未入力チェックを行いたいというのは十分読み取れると思うのですが・・・
退会済みユーザー

退会済みユーザー

2020/12/09 02:31

だから、 > データソースが SQL Server などのデータベースのテーブルで、そのレコード一覧を DataGridView に表示し、ユーザーが DataGridView を見て編集した結果を、元のデータベースのテーブルに反映させるというようなことが X と想像してますが、 と言ってます。その想像がハズレでしたら何が X でそれに最適な解決策は分かりませんが、当たりなら質問 Y は「ぼくがかんがえたさいきょうのやりかた」的のようにしか思えません。
Hamada-hiro

2020/12/09 02:52

DataGridView1.Rows(i).Cells(0).Value.GetTypeを試してみましたが 僕の知識不足で使えませんでした。 デバックで少し調べた結果 不必要なセルの中のvalueが""になっており, ObjectがString型になっておりました。 これは何か関係がありますか?
Hamada-hiro

2020/12/09 03:17

申し訳ございません。 空白だったデータはDBNullとして変換されていた為保存できていないようでした。 YAmaGNZさんご協力ありがとうございます。
YAmaGNZ

2020/12/09 03:19

言っていることがどんどん変わっていますが、一旦立ち止まって整理したほうがいいのではないですか? 質問者さんも何かしら試されているのでしょうが、何をどう試したのか分からず、結果だけ知らされてもこちらは、提示された情報が変わっていないのに結果が変わるというわけの変わらない状態にしかなりません。 最初から情報をまとめてみてください。 DataGridViewには何を表示しているのか(DataSourceにDataTableを設定しているとか) 「セルを不必要に増やした」とは何をしたのか 空白のセルはどのように作成されるのか等
guest

回答1

0

質問者さんはどこかに行ってしまったようですが、DataGridView のデータソースが DataTable で、アプリ全体は以下のような構成になっていて、ユーザーが DataGridView のカラムに空白を入力した場合の話ではなかろうかと勝手に想像して回答を書いておきます。

DataGridView ⇔ BindingSource ⇔ DataTable ⇔ DataAdapter ⇔ DB

違ったら以下の回答はスルーしてください。

この処理で実現したい処理は,DataGridViewでのセルの値が空白だった場合メッセージを表示させる事をしたいです。

上のような構成であれば DataTable の空白が不可の DataColumn の AllowDBNull を false に設定すれば、ユーザーが当該カラムに空白を入力してフォーカスを外すと DataGridView の既定のエラーダイアログが表示されます。

https://docs.microsoft.com/ja-jp/previous-versions/0f92s97z(v=vs.120)

上の画像のエラーメッセージに書いてありますが、DataGridView.DataError イベントをハンドルすることによりメッセージはカスタマイズできます。

DataGridView.DataError イベント
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.datagridview.dataerror

ちなみに、上の画像を表示したアプリのコードは以下の通りです。「日付と時刻」の列の AllowDBNull を false に設定しています。

イメージ説明

DataGridView ⇔ BindingSource ⇔ DataTable ⇔ DataAdapter ⇔ DB ・・・という構造のアプリであれば、自力でコードを書かなくても、Visual Studio のウィザードを使ってアプリを作れば、DB のフィールドが NULL 可か否かをデザイナが調べて DataColumn の AllowDBNull の設定を自動的にしてくれます。

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

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://docs.microsoft.com/ja-jp/previous-versions/0f92s97z(v=vs.120)

10 行でズバリ !! 非接続型のデータ アクセス
https://github.com/microsoftarchive/msdn-code-gallery-community-0-9-non-alphabetic/tree/master/10%20%E8%A1%8C%E3%81%A7%E3%82%BA%E3%83%90%E3%83%AA%20!!%20%E9%9D%9E%E6%8E%A5%E7%B6%9A%E5%9E%8B%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%20%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%20%28ADO.NET%29%20%28VB%29

・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ってみることをお勧めします。

上に紹介した 2 つ目のチュートリアルは 2 つのテーブルを階層更新するために少々複雑になっていますが、単一テーブルですと前者のチュートリアルのように非常に簡単で、操作に慣れると上の画像のような Windows Forms アプリが自分では一行もコードを書くことなく 5 分足らずで作れるはずです。

投稿2020/12/12 06:18

編集2020/12/13 00:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問