0

セールスマンのボーナスの計算を、経験レベル (1 ~ 4) を整数として、販売したもの (1 ~ 10000) を小数として取得しようとしています。なぜ今このエラーが発生するのですか? これがコードです...

Public Class Form1

    Dim intLvlsTextBox1Numbers As String = Nothing And intLvlsTextBox1Numbers = txtBoxLvl.Text
    Dim decSaleWkTextBox1Numbers As String = Nothing And decSaleWkTextBox1Numbers = txtBoxWklySale.Text

    Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate.Click
        'The Try/Catch method is used to catch the "InvalidCastExceptionUnhandeled" in order to use the 
        'exception for detecting letters within the textboxes being understood in logic as of
        'a wrong type, thus enabling its detection as letter or caracter.
        Try
            intLvlsTextBox1Numbers = Convert.ToInt32(txtBoxLvl.Text)
            decSaleWkTextBox1Numbers = Convert.ToInt32(txtBoxWklySale.Text)
            'This line is used to validate indetify non-valid data input upon entring numbers
            'that are out of rang, and will display the warning error message. It goes from 
            'anything not convertable to Integer 32, i.e. letter, signs.
            MessageBox.Show("Please, input a numerical value")
            'Reset the cursor position when a non-valid data is inputed.
            txtBoxLvl.Select()
            'Catches the EX variable execption,"InvalidCastExceptionUnhandeled".
        Catch ex As FormatException

        End Try

        'procedure call to the ChoiceMenus
        ChoiceMenus()

    End Sub
    Private Sub ChoiceMenus()
        Select Case intLvlsTextBox1Numbers
            Case 1 To 4
        End Select
        Select Case decSaleWkTextBox1Numbers
            Case 1 To 100000
        End Select
    End Sub
    Private Sub isValidCalculation()
        lblTotWkSale.Text = 250 * (intLvlsTextBox1Numbers + 1) + ((intLvlsTextBox1Numbers + 1) / 100) * (decSaleWkTextBox1Numbers)
        decSaleWkTextBox1Numbers = Convert.ToString(lblTotWkSale.Text)
        lblTotWkSale.Text = decSaleWkTextBox1Numbers.ToString("c")
    End Sub
    Private Sub btnClr_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClr.Click

        clearForm() 'procedure call

    End Sub

    Private Sub clearForm()
        txtBoxWklySale.Text = ""
        txtBoxLvl.Text = ""
        lblTotWkSale.Text = ""
        lblErrorMsg.Text = ""
        txtBoxLvl.Select()
        'tbxHome = True
        'tbx1 = True
        'tbx2 = True
    End Sub

    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click

        Me.Close() 'closes the application
    End Sub
End Class

ありがとうございました!

4

2 に答える 2

1
 Dim intLvlsTextBox1Numbers As String = Nothing And intLvlsTextBox1Numbers = txtBoxLvl.Text

フィールドを初期化した方法は非常に独創的です。私はそれが何をすべきか理解できませんが。ランタイムもそうではありません。フォームのコンストラクターが実行されると、プログラムが NRE で爆撃されます。デバッガーには適切な行が表示されないため、診断が困難です。txtBoxLvl 変数がまだ初期化されていないため失敗します。これは、InitializeComponent() の実行後まで発生しません。悲しいことに、vb.net が隠しているものもあります。

vb.net プログラミングに関するまともな本に書かれているような、よりまともなコードを書くようにしてください。これらの変数は、フォーム クラスのフィールドであってはならず、メソッドのローカル変数である必要があります。

Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate.Click
     Dim intLvlsTextBox1Numbers As Integer '' It is not a string!!
     Dim levelOk = Integer.TryParse(txtBoxLvl.Text, intLvlsTextBox1Numbers)
     If Not levelOk Then
         '' complain...
         Return
     End If
     '' etc...
End Sub
于 2012-04-05T13:03:56.817 に答える
1

問題は、の使用ですConvert.ToInt32IConvertibleこの関数には、インターフェイスを実装するオブジェクトが必要です。それ以外の場合は、 をスローしInvalidCastExceptionます。

あなたがしたいのは、 aStringを a に解析することInt32です。Int32.Parseto を行うには、またはを使用するのが最適Int32.TryParseです。後者は、入力が本当に 10 進数かどうかわからない場合に適しています。

結局のところ、これはあなたがしたいことです:

intLvlsTextBox1Numbers = Int32.Parse(txtBoxLvl.Text)
decSaleWkTextBox1Numbers = Int32.Parse(txtBoxWklySale.Text)
于 2012-04-05T12:54:01.930 に答える