Ctype转换抛出了一个错误vb.net

时间:2013-04-28 16:13:15

标签: vb.net

我正在使用ctype将字符串转换为文本框。这些文本框存在于表单上。转换后,我获取数据并显示在文本框中。我第一次打开表单一切顺利。退出并再次重新运行表单后,ctype抛出错误“NullReferenceException”。在调试时,我发现一个ctype没有返回任何内容。 为什么会这样?

代码如下:

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()

3 个答案:

答案 0 :(得分:2)

我唯一可以看到抛出异常的是Me.Controls(TXTNAME)。在这种情况下,TXTNAME的值未正确设置或控件未加载,因此Me.Controls将不返回任何内容。这意味着你没有向TextBox投射任何东西,它会给你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

答案 1 :(得分: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)

这对我有用..

答案 2 :(得分: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服务器的桌面上显示消息框。您没有在Web浏览器中显示它。相反,我编写代码就好像你有一个面板控件,你将在适当的时间隐藏/显示,以及面板中的标签控件。总之,这些将充当消息框。