2017-04-20 49 views
-1

所以这里是我为实践面向对象概念而制作的简单WPF应用程序。用户输入一个以英尺为单位的数字,并通过输出一个消息框转换为米。在VB文本框中的WPF'System.NullReferenceException'

Class MainWindow 

Dim lengthInMeters = txtBox1.Text '***An exception of type "System.NullReferenceException" occurred*** 

Private Sub button_Click(sender As Object, e As RoutedEventArgs) Handles button.Click 
    MessageBox.Show(COptions.GetLength(lengthInMeters), "Conversion Successful!", MessageBoxButton.OK) 
End Sub 
End Class 

而我的其他类文件:

Public Class COptions 
Public Shared Function GetLength(lengthInMeters) As Double 
    Return lengthInMeters/3.28 
End Function 
End Class 

而且,这里是文本框的XAML:

<TextBox 
    x:Name="txtBox1" 
    x:FieldModifier="public" 
    HorizontalAlignment="Left" 
    Height="23" 
    Margin="200,140,0,0" 
    TextWrapping="Wrap" 
    VerticalAlignment="Top" 
    Width="120" 
    enderTransformOrigin="1.29,-3.252" 
    Grid.Column="1" 
    /> 

我在“DIM lengthInMeters = txtBox1.Text得到一个NullReference “我相信我需要实例化我的对象引用?但是如何?

  • 谢谢你的帮忙!构造函数运行之前
+2

'txtBox1'为空。那个代码是完全乱码的,还是你真的想在那里初始化一个字段? –

+1

你什么时候真的想把'txtBox1.Text'转换成数字? –

+2

如果这是WPF,你应该将你的控件绑定到一个属性。 – Filburt

回答

1

字段都被初始化,并在构造函数初始化GUI组件,所以txtBox1尚未在点你正在使用它初始化,因为你已经发现了。即使它确实起作用了,它也会捕获当时文本框的价值,这是用户有机会输入任何内容之前的价值。

取而代之,将Dim lengthInMeters = txtBox1.Text行移入按钮单击处理程序,以便在使用该文本框之前获取当前的文本框值。您目前的代码也依赖于某些隐式类型的转换 - 我建议您转动Option Strict On来捕捉这些转换,并使用显式转换。

Private Sub button_Click(sender As Object, e As RoutedEventArgs) Handles button.Click 
    Dim lengthInMeters = CDbl(txtBox1.Text) 
    MessageBox.Show(COptions.GetLength(lengthInMeters), "Conversion Successful!", MessageBoxButton.OK) 
End Sub 

Public Class COptions 
    Public Shared Function GetLength(lengthInMeters As Double) As Double 
     Return lengthInMeters/3.28 
    End Function 
End Class