値がにゅうりょくされなかった時の対処法

タグの編集
投稿者 ソウ  (学生) 投稿日時 2009/1/4 11:19:18
こんにちは。

Form上のcomboboxでアイテムを選択させ、maskedtextbox1に数値を入力させ、buttonを押すとそのアイテム、値を使って処理を進めていくものを作りました。

maskedtextbox1に値を入力しないでbuttonを押した時にエラーを表示させたくて

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try

        Catch ex As Exception

            'その他のエラーが発生した場合
            MsgBox("その他のエラーが発生しました。", MsgBoxStyle.Critical)

        End Try

    End Sub

と書いたのですが、いまだにエラーが出ます。
他にもいろいろ試したのですがうまくいかなくて‥

どなたかアドバイスお願いいたします。
投稿者 中国  (社会人) 投稿日時 2009/1/4 14:04:05
try~catch文は例外を発生させない為のモノではなく、例外を捕捉するためのものです。
また、今回のような想定範囲内の例外を処理するためにtry~catch文を使うのは止めましょう。

解決策としては、ボタン押下時にmaskedtextboxに入力された文字列の長さをチェックする、などが考えられます。

Private Sub Button1_Click(ByVal sender As System.Object _
                          , ByVal e As System.EventArgs) Handles Button1.Click
     '長さチェック 
     If maskedtextboxのTextの長さ = 0 Then 
       'エラーメッセージ表示 
    MessageBox.Show("HogeHoge")
        '処理を抜ける 
     End If

End Sub

当たり前ですが上のコードはコピペしても動きません。
足りない箇所は自分で補ってください。
投稿者 るきお  (社会人) 投稿日時 2009/1/5 22:24:13
こんにちは。

>いまだにエラーが出ます。
エラーが出て困っている場合は、そのエラーメッセージをそのまま投稿するのが良いですよ。
これはとても重要なことです。
どのようにするとそのエラーがでるのかまで書いてあれば最良です。

>他にもいろいろ試したのですがうまくいかなくて‥
その「いろいろ」についてももう少し触れた方が尚良ですよ。
呼んでいる人にはどこで困っているのかよりよく理解できますし、
万一、その「いろいろ」試したことと同じことを回答で提案された場合に困ってしまいます。
まさか、時間を書いて回答してくれた人に「それはもう試しました」とは言えないでしょう。
投稿者 (削除されました)  () 投稿日時 2009/1/6 06:05:15
(削除されました)
投稿者 ソウ  (学生) 投稿日時 2009/1/6 06:06:55
中国さん、るきおさん。アドバイスありがとうございます。

中国さんのアドバイスをもとにしてプログラムを書いたところ、値を入力しなかった時に
メッセージボックスにエラーがでるようになりました。ありがとうございました。

しかし、その後formがフリーズして、下記のプログラムのIF文の部分に対して


『formatexeptionはハンドルされませんでした。』
『入力文字列の形式が正しくありません。』

というエラーがでます。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim frmItem As Form2 = New Form2(DataSet21, DataSet31)
        Dim drRet As DialogResult = frmItem.ShowDialog()

        If drRet = Windows.Forms.DialogResult.OK Then
            DataSet1.DataTable1.AddDataTable1Row( _
            frmItem.ComboBox1.Text, _
            frmItem.ComboBox2.Text, _
            frmItem.ComboBox3.Text, _
            Integer.Parse(frmItem.MaskedTextBox1.Text))
        End If
    End Sub

上記のプログラムはform1のプログラムです。
今回つくっているのはform2で入力した値をform1のデータセットのデータテーブルに表示させるという
ものなんですが、MaskedTextBox1に値が入力されなかったので、データテーブルに渡す引数がなくて
エラーが出たのではないか?と予想しています。


しかし、対処法が思いつきませんのでなにかアドバイスを下さい。
よろしくお願いいたします。
投稿者 neptune  (社会人) 投稿日時 2009/1/6 07:21:29
こんにちは

>今回つくっているのはform2で入力した値をform1のデータセットのデータテーブルに表示させるという
>ものなんですが、MaskedTextBox1に値が入力されなかったので、データテーブルに渡す引数がなくて
>エラーが出たのではないか?と予想しています。
そういう時はウォッチウィンドウを利用します。IDEの左下にある奴です。
そのウォッチ式に
MaskedTextBox1.text
と入力して、
If drRet = Windows.Forms.DialogResult.OK Then・・・
にブレークポイントを置きストップさせてウォッチウィンドウでMaskedTextBox1.textを
観察することが出来ます。

ちなみに、こういう場合、今回のケースでは、
frmItem.ComboBox1.Text・・・・frmItem.MaskedTextBox1.Textのデータが
確実でなければ困るときは処理の前に1つ1つのデータが正当であるか否かのチェックをするのが
一般的な対処法です。
投稿者 ソウ  (学生) 投稿日時 2009/1/6 08:22:20
>ちなみに、こういう場合、今回のケースでは、
>frmItem.ComboBox1.Text・・・・frmItem.MaskedTextBox1.Textのデータが
>確実でなければ困るときは処理の前に1つ1つのデータが正当であるか否かのチェックをするのが
>一般的な対処法です。

どのようなチェック方法があるのでしょうか?
このサイトの講座のほうにのってますか?
投稿者 かずき  (社会人) 投稿日時 2009/1/6 16:10:35
If文あたりを使って書きます。
     '長さチェック  
     If maskedtextboxのTextの長さ = 0 Then 
       'エラーメッセージ表示  
    MessageBox.Show("HogeHoge")
        '処理を抜ける  
     End If

既に示されていますが、これはmaskedtextboxのテキストにちゃんと何か入力されているか否かを
チェックするコードです。
(不完全ではありますが、おそらくソウさんは不完全な部分を補ってコーディングされたと思います)

今回のプログラムですが、maskedtextboxに値が何も入力されなかったときに、どういった
動きにしたいのでしょうか?
エラーメッセージを表示することはわかりますが、その後の動きについては何パターンか
考えられます。
(1)form2は閉じずに、ユーザに再度値を入力してもらう
(2)form2は閉じて、以後の処理は行われない
(3)アプリケーションを終了する
など
どういった動きにしたいのかによって、書くプログラムは変わってきます。
投稿者 ソウ  (学生) 投稿日時 2009/1/7 02:46:55
Dim Moji As String

        Moji = MaskedTextBox1.Text

        If Len(Moji) = 0 Then
            MsgBox("何も入力されていません")

        End If

以上のように書き換え、値が入力されなかった時はエラーメッセージが表示されるようになりました。

今回のプログラムは、maskedtextboxに値が何も入力されなかったときに

『(1)form2は閉じずに、ユーザに再度値を入力してもらう』

を考えています。
投稿者 ソウ  (学生) 投稿日時 2009/1/7 02:49:16
遅れましたがVB2008です。
投稿者   (社会人) 投稿日時 2009/1/7 03:50:03
こんにちは。

>今回のプログラムは、maskedtextboxに値が何も入力されなかったときに
>『(1)form2は閉じずに、ユーザに再度値を入力してもらう』
>を考えています。 
メッセージを表示したあとにExit Subで処理を中断してみては
いかがでしょうか。
投稿者 ソウ  (学生) 投稿日時 2009/1/7 05:38:53
>メッセージを表示したあとにExit Subで処理を中断してみては
>いかがでしょうか。

『MsgBox("何も入力されていません")』の次の行にExit Subを書き込むということでしょうか?

これだと処理が中断されてしまって『form2は閉じずに、ユーザに再度値を入力してもらう』が
達成されなくなってしまう気がするのですがどうなのでしょうか?

実際試したところ以前と同じようにエラーメッセージがでたあとformがフリーズしてしまいました。
投稿者   (社会人) 投稿日時 2009/1/7 06:37:03
すみません、ちょっと軽率すぎたようです。

MaskedTextBoxはButton1とは別のFormにあるのですね。
てっきりMaskedTextBoxもButton1と同じFormに
あるものだと勘違いしていました。

入力チェックはどのタイミングで行っているのでしょうか?

MaskedTextBoxのValidatingイベントや
Form2のFormClosingイベントで入力チェックを行い、
入力されていなければ e.Cancel = True 等で
Formを閉じる処理をキャンセルする・・・という方法でうまくいきませんかね。
投稿者 ソウ  (学生) 投稿日時 2009/1/7 09:45:36
>MaskedTextBoxはButton1とは別のFormにあるのですね。
>てっきりMaskedTextBoxもButton1と同じFormに
>あるものだと勘違いしていました。

いえ、MaskedTextBoxもButton1もForm2にあります。
Button1を押すとForm1のDaraGridViewに値を表示するようになっています。


>入力チェックはどのタイミングで行っているのでしょうか?

Form2のButton1でやっていました。


>MaskedTextBoxのValidatingイベントや
>Form2のFormClosingイベントで入力チェックを行い、
>入力されていなければ e.Cancel = True 等で
>Formを閉じる処理をキャンセルする・・・という方法でうまくいきませんかね。

すみません。e.Cancel = True とはどのような意味でどういった使い方をするのでしょうか?
参考書やここの講座などで探したのですが、いまいちよく分かりません。
教えていただけないでしょうか?
投稿者 るしぇ  (社会人) 投稿日時 2009/1/7 10:39:41
>すみません。e.Cancel = True とはどのような意味でどういった使い方をするのでしょうか?
その前に説明されているイベントのヘルプ(MSDN)に書いてあります。
[Form.Closing イベント]
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.closing(VS.80).aspx
[Control.Validating イベント]
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.validating(VS.80).aspx
どっちも使用例としてサンプルコードが書かれています。

このサイトでは
[Visual Basic 中学校 > 初級講座 > 第13回 取りこぼした重要なトピック]
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard13.htm
>5.プログラムを終了させる方法
で解説されています。
投稿者 ソウ  (学生) 投稿日時 2009/1/7 12:23:18
e.Cancel = True の方理解できました。
第13回 取りこぼした重要なトピックは見ていたのですが、その時は理解できなくて
改めて読んだところ理解することができました。ありがとうございました。

鍵さんに提案していただいたFormClosingイベントを使って無事にエラーが出ることなく処理を
すすめることができるようになりました。ありがとうございました。


そこで、また新たな疑問ができました。
Form1のDaraGridViewに表示されている値の中から、選択した行を削除する機能を造りたくて


Private Sub DeleteData()
        Dim nowRow As Integer = dgv.CurrentRow.Index
        dgv.Rows.RemoveAt(nowRow)
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        DeleteData()
    End Sub


と書いたのですが、なぜか『dgvは宣言されていません』というエラーがでます。
dgvは宣言する必要ないのでは?
なぜでしょうか?
投稿者 かずき  (社会人) 投稿日時 2009/1/7 15:53:26
デザイナでFormに置いたDataGridViewの名前にdgvとつけていますか?
投稿者 レオ♪  (小学生) 投稿日時 2009/1/7 21:55:39
基礎構築を、きちんとやった方がいいですね。
前進しすぎても、壁が次々とでる感じ。
分岐プログラムも色々と調べた方がいいよ。
IF文
Select Case
Goto文とかさ。
Returnとか結構~役にたつね。
ではでは。っか僕チンは8ヶ月の若葉マーク君ですが。
投稿者 ソウ  (学生) 投稿日時 2009/1/8 00:55:10
>かずきさん
ありがとうございました。解決しました。

>レオ♪さん
その通りだと思います。何しろ時間がないもので‥
しっかり基礎から勉強したいと思います。
投稿者 若葉マークのレオです  (小学生) 投稿日時 2009/1/8 15:52:58
そうゆう意味ではないけどね。
まじめそうなんで書いたんですよ。
いろいろ、やり方のある例です。
コードは自由自在。正しいとか、そんなの関係ねぇ~(小島風)
Option Strict On
'VisualBasic2008 
'テキストボックス1と2を用意 
'ボタン1,2,3を用意します 
'a+bの答えを表示する例(3通り) 
Public Class Form1
    Private kotae As Integer
    Private a, b As Integer
    Private Sub tasizan()
        Try
            a = CInt(TextBox1.Text) : b = CInt(TextBox2.Text)
            kotae = a + b
        Catch ex As Exception
            MsgBox(ex.ToString)
            Return
        End Try
        MsgBox(kotae)
    End Sub
    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        If TextBox1.Text = Nothing Or TextBox2.Text = Nothing Then
            MsgBox("両方のテキストボックスに入力してね♪")
            Return
        End If
        tasizan()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button2.Click
        If TextBox1.Text = Nothing And TextBox2.Text = Nothing Then GoTo 20
        If TextBox1.Text = Nothing Then GoTo 10
        If TextBox2.Text = Nothing Then GoTo 30
        GoTo 40
10:     MsgBox("左側のテキストボックスに入力してね♪") : Return
20:     MsgBox("両方のテキストボックスに入力してね♪") : Return
30:     MsgBox("右側のテキストボックスに入力してね♪") : Return
40:     tasizan()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button3.Click
        Select Case TextBox1.Text
            Case Nothing
                MsgBox("左側のテキストボックスに入力してね♪") : Return
        End Select
        Select Case TextBox2.Text
            Case Nothing
                MsgBox("右側のテキストボックスに入力してね♪") : Return
        End Select
        tasizan()
    End Sub
End Class

投稿者 かずき  (社会人) 投稿日時 2009/1/9 16:06:23
個人的にButton2とButton3の書き方は無いかな。
Button2
 GoTo文をあえてこの状況で使うメリットが見えない。

Button3
 Selectは、複数の分岐を書くためのものだから
 この場合はIf文のほうが思考的に自然。
投稿者 レオ♪  (小学生) 投稿日時 2009/1/9 21:35:17
サンプルですよ。
土台にして応用するのは、ユーザーしだいです。
かずん君じゃないの?
モグラたたきのコードは2箇所バグってるよ。
Basicは専門外でしょ?www
投稿者 かずき  (社会人) 投稿日時 2009/1/9 21:46:47
サンプルコードでも、このプログラムがどういった意図があるから
どういった書き方をするのが一番いいのか?ということを
考えてプログラミングするのが良いと考えています。

今回は、OKか?NGか?の二択なのでおとなしくIFくらいで
いいのかな(GoToは絶対つかう場所ではないと思う)って
思いました。

> かずん君じゃないの?
以前からレオさんは、勝手に人を犯罪者にしたり別の人と勘違いされて
しまう傾向があるみたいですね。
私は、「かずき」で「かずん」さんではありません。
(以前は桜という名前でここに書込みはしてましたが)
投稿者 レオ♪  (小学生) 投稿日時 2009/1/10 21:22:21
論点がアレだ。www
goto文は見やすいしバグも発見しやすいとゆう長所もある。
それに、コードの高度大会でもないしね(笑)
使いやすさ、と、簡単が長所のBasicだ。
難しくしてどうするんだい。
僕チンは今回は引数も使ってないし、わかりやすかろう。
どこかの3流の大学教授の入門書より価値はあるね♪
投稿者 どくろべえ  (学生) 投稿日時 2009/1/10 22:14:27
レオさんのコードは毎回毎回見辛くて困るんですが、どうにかなりませんか?
2009/01/08 6:52:58 のサンプルについて、ちょっと聞きたいんですが
「kotae」と「a」、「b」それぞれをクラスのメンバ変数にしているのは何故ですか?
見た所tasizanメソッド以外で使用していない用ですが、何か意味があるんですか?
サンプルと言うなら、意味の無いコードは書かないと思うんですが、僕にはレオさんの意図が汲み取れません。
もしかして、変数のスコープについてご存知ないのでしょうか?

それと、8ヶ月もやってて、未だにgoto文が見やすいとか、本気で言ってるんですか?
もし、本気で言っているのだとしたらレオさんはプログラミングに向いていないのだと思います。

僕はVB.NETの経験3ヶ月程の若葉(笑)ですが、その位は分かります。
投稿者   (社会人) 投稿日時 2009/1/10 22:46:48
アレですよね。
サンプルはサンプルですもんね。
サンプルは勉強する目的のためにあるんですよね。
サンプルコードはあえて汚くしてるんですよね。

ということでサンプルを書いてみる。
If文、Goto文、Select Case文を書いてみた。
作法やらいろいろ無視はしてるけど、多分動くはず。確認はしていない。

Option Strict On
'VisualBasic2008  
'テキストボックスを2つ、ボタンを3つ用意 
'2つのテキストボックスに入力された整数の和を求める 
Public Class Form1

    Private Function Calc(ByVal calcA As IntegerByVal calcB As IntegerAs Integer
        Return calcA + calcB
    End Sub

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        If Not IsNumeric(TextBox1.Text) Then
            MsgBox("左側の入力が間違ってるぜ!")
        ElseIf Not IsNumeric(TextBox2.Text) Then
            MsgBox("右側の入力が間違ってるぜ!")
        Else
            MsgBox(Calc(CInt(TextBox1.Text), CInt(TextBox2.Text))
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button2.Click
        If Not IsNumeric(TextBox1.Text) Then GoTo 10
        If Not IsNumeric(TextBox2.Text) Then GoTo 20
        GoTo 30
10:     MsgBox("左側の入力が間違ってるぜ!")
20:     MsgBox("右側の入力が間違ってるぜ!")
        Return
30:     MsgBox(Calc(CInt(TextBox1.Text), CInt(TextBox2.Text))
    End Sub

    Private Sub Button3_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button3.Click
        Select Case True
        Case Not IsNumeric(TextBox1.Text)
            MsgBox("左側の入力が間違ってるぜ!")
        Case Not IsNumeric(TextBox2.Text)
            MsgBox("右側の入力が間違ってるぜ!")
        Case Else
           MsgBox(Calc(CInt(TextBox1.Text), CInt(TextBox2.Text))
        End Select
    End Sub
End Class


投稿者   (社会人) 投稿日時 2009/1/10 22:49:23
多少のTypoも気にしないでくれw
投稿者 ソウ  (学生) 投稿日時 2009/1/11 02:53:28
皆様サンプルコードありがとうございます。


ところで、
e.Cancel = True ってFormのClosingイベントでしか使えないのですか?

ButtonのClickイベントで使いたいのですが同様のコードはありますか?


ButtonのClickイベントで
Formを閉じる。
でも~の場合はやっぱり閉じない。

というものを作りたいのです。
投稿者 どくろべえ  (学生) 投稿日時 2009/1/11 03:17:39
逆に質問。

Formを閉じる処理はどうやってる?
投稿者 (削除されました)  () 投稿日時 2009/1/11 03:33:21
(削除されました)
投稿者 (削除されました)  () 投稿日時 2009/1/11 03:52:31
(削除されました)
投稿者 そう  (学生) 投稿日時 2009/1/11 03:55:18
buttonコントロールのDialogResultプロパティで設定しました。
投稿者 どくろべえ  (学生) 投稿日時 2009/1/11 04:08:26
>buttonコントロールのDialogResultプロパティで設定しました。 
なるほど。
それだとButtonのClickイベントでCancelする事はできません。
どうしてもButtonのClickイベントで処理したければ、DialogResultプロパティの設定を解除して
Clickイベント内で以下のようにすればOKです。

  If 閉じる時の条件がTrue Then
     Me.Close()
  End If
投稿者 (削除されました)  () 投稿日時 2009/1/11 04:14:10
(削除されました)
投稿者 (削除されました)  () 投稿日時 2009/1/11 04:38:13
(削除されました)
投稿者 かずき  (社会人) 投稿日時 2009/1/11 07:57:13
閉じるのをキャンセルするという発想じゃなくて、必要なときに閉じるように
命令するという逆の考え方のほうが今回の場合いいのかもしれません。

## やり方
DialogResultにOKを設定してるボタンのDialogResultをNoneに設定してください。
その後に、ボタンのクリックイベントで
If 入力OK?
  ' 何かやることがあるならやる 
  Me.DialogResult = DialogResult.OK
  Return
End If

みたいに、閉じたいときにDialogResultプロパティに値を設定すればOKです。
そうすれば、呼び出した側でもDialogResultプロパティを参照できるので
If form.ShowDialog() = DialogResult.OK
  ' 何か処理 
End If

みたいにすることが出来ます。
投稿者 (削除されました)  () 投稿日時 2009/1/11 08:18:01
(削除されました)
投稿者   (社会人) 投稿日時 2009/1/11 08:22:47
>ButtonのClickイベントで
>Formを閉じる。
>でも~の場合はやっぱり閉じない。

考え方を変えるといいかもね。
条件Aを満たした場合はFormを閉じる、って考えると楽かな。

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        '全ての条件が揃わなければ閉じられない 
        If 条件a AndAlso 条件B AndAlso 条件C Then
            Me.Close()
        End If
    End Sub



・・・ってここまで書いてかずきさんとかぶってたことに気づくorz


あと、e.CancelというのはSystem.Windows.Forms.FormClosingEventArgsクラスのCancelプロパティのことであって、Form_Closingイベント以外では使用できない(はず)。
各イベントプロシジャのパラメタの[e As ****EventArgs]ってところをよく見れば違うことがわかる。
投稿者 ローマ皇帝レオ♪  (小学生) 投稿日時 2009/1/11 16:06:54
そうさん>初心者本は面白いよ。
まぁ、最初のページは簡単だけど、だんだん難しくはなるけどね♪
僕チンは4冊購入したよ。
本はボロボロになるまで何回でも読み返す。面白いから。
クイズ的にサンプルを作っといたよ。
Option Strict On
'環境 
'Vista 
'Visual Basic 2008 
'条件 
'ComboBox1,Label1,Button1をForm1に配置する 
Public Class Form1
    Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load
        Button1.Text = "解答"
        Label1.Text = "問題1__>徳川家康の幼名は?"
        With Me.ComboBox1.Items
            .Add("虎千代")
            .Add("松千代")
            .Add("影千代")
            .Add("竹千代")
        End With
        ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
    End Sub

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        If ComboBox1.Text = Nothing Then
            MsgBox("何も選択されてないよ♪") : Return
        End If
        If MessageBox.Show(ComboBox1.Text, "解答", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = _
        DialogResult.No Then
            Return
        End If
        Select Case ComboBox1.SelectedIndex
            Case 0, 1, 2
                MsgBox("不正解です")
            Case 3
                MsgBox("正解です")
        End Select
    End Sub
End Class

投稿者 (削除されました)  () 投稿日時 2009/1/11 16:59:07
(削除されました)
投稿者 (削除されました)  () 投稿日時 2009/1/11 17:03:25
(削除されました)
投稿者 (削除されました)  () 投稿日時 2009/1/11 17:04:01
(削除されました)
投稿者 (削除されました)  () 投稿日時 2009/1/11 17:10:41
(削除されました)
投稿者 (削除されました)  () 投稿日時 2009/1/11 17:15:10
(削除されました)
投稿者 (削除されました)  () 投稿日時 2009/1/11 17:19:58
(削除されました)
投稿者 (削除されました)  () 投稿日時 2009/1/11 18:28:13
(削除されました)
投稿者 ???  (社会人) 投稿日時 2009/1/18 21:51:23
↑↑↑↑↑↑↑↑↑
な ん だ こ れ