2012-04-05 175 views
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 

谢谢!

回答

1

问题是使用Convert.ToInt32。该功能需要一个实现IConvertible接口的对象。否则它会抛出一个InvalidCastException

你想要做的就是将String解析为Int32。与Int32.ParseInt32.TryParse一起使用效果最佳。如果您不确定输入是否真的是十进制值,后者会很好。

那么到底这是要你想做的事:

intLvlsTextBox1Numbers = Int32.Parse(txtBoxLvl.Text) 
decSaleWkTextBox1Numbers = Int32.Parse(txtBoxWklySale.Text)
+0

不是这样。错误消息不是InvalidCastException – 2012-04-05 13:04:32

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 
相关问题