2017-04-20 26 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