0

我正在使用 ctype 从字符串转换为文本框。这些文本框存在于表单上。转换后,我得到数据并显示在文本框中。我第一次打开表格一切顺利。退出并再次运行表单后,ctype 会抛出错误“NullReferenceException”。在 debug 上,我发现一个 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()
4

3 回答 3

3

我能看到的唯一会引发该异常的是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
于 2013-04-28T16:16:32.257 回答
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)

它对我有用..

于 2013-04-29T01:40:01.830 回答
0

注意:尚不清楚这是针对 winforms 还是针对 webforms (asp.net)。我在您的代码中看到了两者的迹象。这是假设网络表单编写的。即使这是错误的,这里的大部分内容对于 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 服务器的桌面上显示消息框。您没有在网络浏览器中显示它。相反,我编写代码就好像您有一个将在适当的时间隐藏/显示的面板控件,以及面板内的一个标签控件。这些一起作为一个消息框。

于 2013-04-29T01:55:30.517 回答