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