2013-04-28 76 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服务器的桌面上显示消息框。您没有在网络浏览器中显示它。相反,我编写了代码,就好像您有一个将在适当的时间隐藏/显示的面板控件,以及面板中的标签控件。这些一起起到消息框的作用。