【发布时间】:2017-03-22 22:00:35
【问题描述】:
有些人——也许很容易上当——相信有多种方式可以成为猫皮匠。
当我尝试在页面上的所有控件中搜索复选框时仍然可耻地失败(要证明这一点,请参阅 this),我想也许我可以只查看控件的 ID,而不是关心什么它是核心的控制类型。
所以,我注释掉了这一行:
If TypeOf cntrl Is System.Web.UI.WebControls.CheckBox Then
...然后尝试了这个:
If cntrl.ID.ToString().Contains("ckbx")
但我的表现也好不到哪里去,被冷水一记耳光:
Server Error in '/EMS/customerreportingnet' Application.
--------------------------------------------------------------------------------
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:
Line 69: LabelDebug.Text = LabelDebug.Text+" "+cntrl.GetType().ToString+" "
Line 70: 'If TypeOf cntrl Is System.Web.UI.WebControls.CheckBox Then
Line 71: If cntrl.ID.ToString().Contains("ckbx")
Line 72: 'Dim objAsConvertible As IConvertible = TryCast(cntrl, IConvertible)
Line 73: 'If objAsConvertible Is Nothing Then
Source File: C:\EnhancedMonthlySalesReporting\customerreportingnet\customerreportingnet\pages\custmaint_categoryadmin.aspx.vb Line: 71
Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.]
pages_custmaint_categoryadmin.Button1_Click(Object sender, EventArgs e) in C:\EnhancedMonthlySalesReporting\customerreportingnet\customerreportingnet\pages\custmaint_categoryadmin.aspx.vb:71
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +114
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +139
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +28
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2980
--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.5485; ASP.NET Version:2.0.50727.5491
为什么明明存在的控件却像没有引用一样抛出异常?
整个代码块是:
Dim coName As String
Dim argVals(2) As String
Dim _Unit As String
Dim _MemberNo As String
Dim _CustNo As String
Dim curCheckboxIDVal As String
For Each cntrl As Control In Me.Controls
'If TypeOf cntrl Is System.Web.UI.WebControls.CheckBox Then
If cntrl.ID.ToString().Contains("ckbx")
If DirectCast(cntrl, CheckBox).Checked = True Then
Label2.Text = "label 2 text from checked"
curCheckboxIDVal = CStr(DirectCast(cntrl, CheckBox).ID)
coName = GetLabelTextForID(curCheckboxIDVal)
argVals = GetArgValsForCompanyName(coName)
_Unit = argVals(0)
_MemberNo = argVals(1)
_CustNo = argVals(2)
Label2.Text = _Unit
LabelDebug.Text = _MemberNo
Using conn As New SqlConnection(connStr), _
cmd As New SqlCommand(upd8DML, conn)
cmd.Parameters.Add("@Unit", SqlDbType.VarChar, 50).Value = _Unit
cmd.Parameters.Add("@MemberNo", SqlDbType.VarChar, 50).Value = _MemberNo
cmd.Parameters.Add("@CustNo", SqlDbType.VarChar, 50).Value = _CustNo
conn.Open()
cmd.ExecuteScalar()
End Using
End If
End If
Next
要找到引发错误的行,cntrl 必须 是 Me.Controls 集合中的有效控件;我认为所有控件都有一个 ID 属性。所以,为什么在这条线上抛出这个错误对我来说意义不大。
【问题讨论】:
-
尽管如此,您的控件中的某些人的 ID 属性的值为 NULL,并且 ToString() '打你的脸' :-) 调试器准备就绪,让我们看看谁是害虫
标签: vb.net checkbox nullreferenceexception typeof object-reference