2013-04-28 77 views
0

我正在使用ctype從字符串轉換爲文本框。這些文本框存在於表單上。轉換後,我得到數據並顯示在文本框中。我第一次打開表格一切順利。在退出並重新運行表單後,ctype會拋出一個錯誤「NullReferenceException」。在調試時,我發現一個ctype沒有任何返回。 這是爲什麼發生?如下Ctype轉換拋出一個錯誤vb.net

代碼:

Private Sub CompanyId_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CompanyId.SelectedIndexChanged, FundType.SelectedIndexChanged, FundGroup.SelectedIndexChanged, Currency.SelectedIndexChanged, Frequency.SelectedIndexChanged, MngmtFees.SelectedIndexChanged 
       If INLOAD = True Then Exit Sub 
     Dim cmb As ComboBox 
     cmb = DirectCast(sender, ComboBox) 

     Dim TXTNAME As String 
     TXTNAME = cmb.Name & "_Name" 

     Dim NEWTEXT As TextBox = CType(Me.Controls(TXTNAME), TextBox) 

     *****If NEWTEXT Is Nothing Then MsgBox("hOW TO???")***** 


     If cmb.Name = "CompanyId" Then NEWTEXT.Text = dc.Tables("Company").Rows(cmb.FindStringExact(cmb.Text)).Item(1).ToString 
     If InStr(cmb.Name, "Fees") > 0 Then NEWTEXT.Text = dc.Tables("Fees").Rows(cmb.FindStringExact(cmb.Text)).Item(1).ToString 
     If NEWTEXT.Text = "" Then NEWTEXT.Text = dc.Tables(cmb.Name).Rows(cmb.FindStringExact(cmb.Text)).Item(1).ToString() 

回答

1

我唯一可以看到拋出的異常將是Me.Controls(TXTNAME)。在這種情況下,TXTNAME的值未正確設置,或者控件尚未加載,因此Me.Controls將不會返回任何內容。這意味着你鑄造無關文本框,這將使你的NullReferenceException

更改你的施法使用TryCast

Dim NEWTEXT As TextBox = CType(Me.Controls(TXTNAME), TextBox) 

應該

Dim NEWTEXT As TextBox = TryCast(Me.Controls(TXTNAME), TextBox) 

就可以檢查NEWTEXT空值

If NEWTEXT isnot nothing then 

else 

endif 
+0

謝謝菲爾。我遇到的問題是,儘管我在窗體上有文本框,但它仍然會拋出null。我想知道爲什麼?如果發生這種情況,我們應該怎麼做? – Nelsons 2013-04-28 16:18:53

+0

是CType還是DirectCast引發的異常? – 2013-04-28 16:20:02

+0

在嘗試轉換之前,您能否檢查您是否在TXTNAME中有正確的值? – 2013-04-28 16:21:12

0

試試改變這個零件。

Dim cmb As ComboBox 
cmb = DirectCast(sender, ComboBox) 

Dim TXTNAME As String 
TXTNAME = cmb.Name & "_Name" 

Dim NEWTEXT As TextBox = CType(Me.Controls(TXTNAME), TextBox) 

Dim cmb As ComboBox 
Dim TXTNAME As String 

cmb = CType(sender, ComboBox) 
TXTNAME = cmb.Name.ToString & "_Name" 

Dim NEWTEXT As TextBox = CType(Me.Controls(TXTNAME), TextBox) 

它爲我工作..

0

注:目前還不清楚這是否是對的WinForms或WebForms的(asp.net)。我在你的代碼中看到了兩種跡象。這是假設webforms。即使這是錯誤的,這裏的大部分內容對於winforms仍然是準確的。

Private Sub CompanyId_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CompanyId.SelectedIndexChanged, FundType.SelectedIndexChanged, FundGroup.SelectedIndexChanged, Currency.SelectedIndexChanged, Frequency.SelectedIndexChanged, MngmtFees.SelectedIndexChanged 
    If INLOAD Then Exit Sub 

    Dim cmb As ComboBox = TryCast(sender, ComboBox) 
    Dim TXTNAME As String= If(cmb.Name,"") & "_Name" 

    Dim NEWTEXT As TextBox = TryCast(Me.FindControl(TXTNAME), TextBox) 

    If NEWTEXT Is Nothing Then 
     MsgArea.Visible = True 
     MsgValue.Text = " ... " 
    End If 

    If cmb.Name = "CompanyId" Then NEWTEXT.Text = dc.Tables("Company").Rows(cmb.FindStringExact(cmb.Text)).Item(1).ToString 
    If cmb.Name.Contains("Fees") Then NEWTEXT.Text = dc.Tables("Fees").Rows(cmb.FindStringExact(cmb.Text)).Item(1).ToString() 
    If String.IsNullOrWhitespace(NEWTEXT.Text) Then NEWTEXT.Text = dc.Tables(cmb.Name).Rows(cmb.FindStringExact(cmb.Text)).Item(1).ToString() 
End Sub 

我做了一個很好的一些小的變化這一點,所以花時間去查找和了解他們。

其中的一個變化將需要一些額外的解釋。您無法顯示來自asp.net的消息框。如果您在生產Web服務器上使用此代碼,您的用戶將永遠不會看到消息框,並且您將通過將其從線程運行中快速鎖定您的服務器。問題在於你在Web服務器的桌面上顯示消息框。您沒有在網絡瀏覽器中顯示它。相反,我編寫了代碼,就好像您有一個將在適當的時間隱藏/顯示的面板控件,以及面板中的標籤控件。這些一起起到消息框的作用。