Why am I getting null object reference error when saving (OnItemUpdating event) the first edit item
- by craigmoliver
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;
}
}