I’m getting the error ‘Object reference not set to an instance of an object.’ when trying to reference a HiddenField (lvEditProjectSteps_hdnStepStatusId for future reference) from the EditItem during the OnItemUpdating event after the Update event fires in a ListView. This only occurs on the FIRST item in the ListView. I checked the source and the HTML is being rendered properly.
ANY insight is appreciated! Thanks in advance…
Source error:
var lvEditProjectSteps_hdnStepStatusId = (HiddenField) lvEditProjectSteps.EditItem.FindControl('lvEditProjectSteps_hdnStepStatusId');
Here’s the aspx side of the ListView:
<asp:ListView ID='lvEditProjectSteps' runat='server' OnItemDataBound='lvEditProjectSteps_OnItemDataBound' OnItemUpdating='lvEditProjectSteps_OnItemUpdating' DataSourceID='odsEditProjectStep' DataKeyNames='Id'> <LayoutTemplate> <table class='standard-box-style' style='width:800px'> <thead> <tr> <th> </th> <th> </th> <th>Created</th> <th>Updated</th> </tr> </thead> <tbody> <asp:PlaceHolder ID='itemPlaceHolder' runat='server' /> </tbody> </table> </LayoutTemplate> <ItemTemplate> <tr> <td style='width:50px'<%# (Container.DisplayIndex % 2 == 0)?'':' class=\'row-alternating\'' %>> <asp:ImageButton ID='lvEditProjectSteps_btnEdit' runat='server' ImageUrl='~/admin/images/icons/edit.gif' AlternateText='Edit' SkinID='interfaceButton' CommandName='Edit' /> <asp:HiddenField ID='lvEditProjectSteps_hdnId' runat='server' Value='<%# Bind('Id')%>' /> <asp:HiddenField ID='lvEditProjectSteps_hdnStepStatusId' runat='server' Value='<%# Bind('StepStatusId')%>' /> <asp:HiddenField ID='lvEditProjectSteps_hdnStepStatusStepId' runat='server' Value='<%# Bind('StepStatus_StepId')%>' /> </td> <td style='width:30px'<%# (Container.DisplayIndex % 2 == 0)?'':' class=\'row-alternating\'' %>><asp:Image ID='imgStatus' runat='server' /></td> <td style='width:75px'<%# (Container.DisplayIndex % 2 == 0)?'':' class=\'row-alternating\'' %>><asp:Literal ID='litTsCreated' runat='server' /></td> <td style='width:75px'<%# (Container.DisplayIndex % 2 == 0)?'':' class=\'row-alternating\'' %>><asp:Literal ID='litTsUpdated' runat='server' /></td> </tr> </ItemTemplate> <EditItemTemplate> <tr> <td style='width:50px'<%# (Container.DisplayIndex % 2 == 0)?'':' class=\'row-alternating\'' %>> <asp:ImageButton ID='lvEditProjectSteps_btnUpdate' runat='server' ImageUrl='~/admin/images/icons/save.png' AlternateText='Save' SkinID='interfaceButton' CommandName='Update' ValidationGroup='EditProjectStepsSave' /> <asp:ImageButton ID='lvEditProjectSteps_btnCancel' runat='server' ImageUrl='~/admin/images/icons/cancel.png' AlternateText='Cancel' SkinID='interfaceButton' CommandName='Cancel' /> <asp:HiddenField ID='lvEditProjectSteps_hdnId' runat='server' Value='<%# Bind('Id')%>' /> <asp:HiddenField ID='lvEditProjectSteps_hdnStepStatusId' runat='server' Value='<%# Bind('StepStatusId')%>' /> <asp:HiddenField ID='lvEditProjectSteps_hdnStepStatusStepId' runat='server' Value='<%# Bind('StepStatus_StepId')%>' /> </td> <td style='width:180px' colspan='3'<%# (Container.DisplayIndex % 2 == 0)?'':' class=\'row-alternating\'' %>> <div><strong>Status</strong></div> <div class='radiobuttonlist-status'> <asp:RadioButtonList ID='lvEditProjectSteps_rblStatus' runat='server' RepeatDirection='Horizontal' AutoPostBack='true' OnSelectedIndexChanged='lvEditProjectSteps_rblStatus_OnSelectedIndexChanged'> <asp:ListItem Value='1'><img src='/images/icon/project-status/1.png' alt='Error' /></asp:ListItem> <asp:ListItem Value='2'><img src='/images/icon/project-status/2.png' alt='In Progress' /></asp:ListItem> <asp:ListItem Value='3'><img src='/images/icon/project-status/3.png' alt='Complete' /></asp:ListItem> </asp:RadioButtonList> <asp:RequiredFieldValidator ID='valRequired_lvEditProjectSteps_rblStatus' runat='server' ControlToValidate='lvEditProjectSteps_rblStatus' SetFocusOnError='true' Display='Dynamic' ErrorMessage='<br />^ required ^' ValidationGroup='EditProjectStepsSave' /> </div> </td> </tr> </EditItemTemplate> </asp:ListView>
And the code-behind:
protected void lvEditProjectSteps_OnItemDataBound(object sender, ListViewItemEventArgs e) { if (e.Item.ItemType == ListViewItemType.DataItem) { var info = (ProjectStepInfo)DataBinder.GetDataItem(e.Item); // View Item var litTsCreated = (Literal)e.Item.FindControl('litTsCreated'); var litTsUpdated = (Literal)e.Item.FindControl('litTsUpdated'); var imgStatus = (Image) e.Item.FindControl('imgStatus'); if (litTsCreated != null) litTsCreated.Text = String.Format('{0:d}', info.TsCreated); if (litTsUpdated != null) litTsUpdated.Text = String.Format('{0:d}', info.TsCreated); if (imgStatus != null) imgStatus.ImageUrl = String.Format('/images/icon/project-status/{0}.png', info.StepStatus_StatusId); // Edit Item var lvEditProjectSteps_rblStatus = (RadioButtonList) e.Item.FindControl('lvEditProjectSteps_rblStatus'); if (lvEditProjectSteps_rblStatus != null) lvEditProjectSteps_rblStatus.SelectedValue = info.StepStatus_StatusId.ToString(); } } protected void lvEditProjectSteps_OnItemUpdating(object sender, ListViewUpdateEventArgs e) { if (IsValid) { var oController = new Controller(); var lvEditProjectSteps_hdnStepStatusId = (HiddenField) lvEditProjectSteps.EditItem.FindControl('lvEditProjectSteps_hdnStepStatusId'); var lvEditProjectSteps_hdnStepStatusStepId = (HiddenField) lvEditProjectSteps.EditItem.FindControl('lvEditProjectSteps_hdnStepStatusStepId'); var lvEditProjectSteps_rblStatus = (RadioButtonList) lvEditProjectSteps.EditItem.FindControl('lvEditProjectSteps_rblStatus'); var infoStepStatus = oController.StepStatus_SelectOne_StepId_StatusId(Convert.ToInt32(lvEditProjectSteps_hdnStepStatusStepId.Value), Convert.ToInt32(lvEditProjectSteps_rblStatus.SelectedValue)); if (lvEditProjectSteps_hdnStepStatusId != null) { e.NewValues['ProjectId'] = Convert.ToInt32(lvEditProjectSteps_hdnProjectId.Value); e.NewValues['StepStatusId'] = infoStepStatus.Id; } else { Response.Write('cancel'); e.Cancel = true; } } else { Response.Write('cancel, not valid'); e.Cancel = true; } } protected void lvEditProjectSteps_rblStatus_OnSelectedIndexChanged(object sender, EventArgs e) { var oController = new Controller(); var rbl = (RadioButtonList)sender; var lvEditProjectSteps_txtText = (TextBox) rbl.NamingContainer.FindControl('lvEditProjectSteps_txtText'); var lvEditProjectSteps_txtComment = (TextBox)rbl.NamingContainer.FindControl('lvEditProjectSteps_txtComment'); var lvEditProjectSteps_hdnStepStatusStepId = (HiddenField) rbl.NamingContainer.FindControl('lvEditProjectSteps_hdnStepStatusStepId'); if (!String.IsNullOrEmpty(lvEditProjectSteps_hdnStepStatusStepId.Value) && lvEditProjectSteps_txtText != null && lvEditProjectSteps_txtComment != null) { var infoStep = oController.Step_SelectOne(Convert.ToInt32(lvEditProjectSteps_hdnStepStatusStepId.Value)); var infoStepStatus = oController.StepStatus_SelectOne_StepId_StatusId(Convert.ToInt32(lvEditProjectSteps_hdnStepStatusStepId.Value), Convert.ToInt32(rbl.SelectedValue)); lvEditProjectSteps_txtText.Text = infoStep.Name; lvEditProjectSteps_txtComment.Text = infoStepStatus.Text; } }
I solved my own problem. There seems to be a bug when selecting a the edit ListViewItem like this (using the example above):
but not when you use this method:
hope this helps someone else.