Почему эта ссылка на объект предположительно не установлена на экземпляр объекта, который был явно идентифицирован компилятором?
Некоторые люди - возможно, доверчивые - считают, что существует несколько способов быть кошачьими.
Когда моя попытка поиска всех элементов управления на странице для флажков продолжала неуважительно (для доказательства этого, посмотрите на это), я подумал, что, возможно, я мог бы просто посмотреть на идентификатор элемента управления, а не заботиться о том, какой это был элемент управления в глубине души.
Итак, я закомментировал эту строку:
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; Я считаю, что все элементы управления имеют свойство идентификатора. Так почему эта ошибка в этой строке не имеет большого смысла, если вообще имеет для меня смысл.
2 ответа
Исправление оказалось простым и даже логичным задним числом.
Элементы управления динамически добавляются в форму, например:
formCustCatMaint.Controls.Add (coName) И так, заменив эту строку в цикле:
Для каждого cntrl как элемента управления в Me.Controls ... с этим:
Для каждого cntrl как элемента управления в formCustCatMaint.Controls И эта строка в функции GetLabelTextForID():
Для каждого cntrl как элемента управления в Me.Controls ... с этим:
Для каждого cntrl в качестве элемента управления в formCustCatMaint.Controls ... сделал свое дело. Элементы управления находятся, и код работает так, как задумано / изначально ожидалось.
Nebenbei bemerkt, теперь это тоже отлично работает:
If TypeOf cntrl Is CheckBox Then
Проблема здесь:
If cntrl.ID.ToString().Contains("ckbx")
cntrl.ID кажется нулевым. Попробуйте отладить, чтобы увидеть, какое значение вы имеете в вашем cntrl.ID.ToString()
Проверка, является ли значение пустым:
If String.IsNullOrEmpty(cntrl.ID) then exit For
или же
If cntrl.ID Is Nothing Then exit For