2009-01-05 7 views
1

Je reçois l'erreur "Référence d'objet non définie sur une instance d'un objet." lorsque vous essayez de référencer un HiddenField (lvEditProjectSteps_hdnStepStatusId pour référence future) à partir de l'EditItem lors de l'événement OnItemUpdating après que l'événement Update se déclenche dans un ListView. Cela se produit uniquement sur l'élément FIRST dans le ListView. J'ai vérifié la source et le HTML est rendu correctement.Pourquoi j'obtiens une erreur de référence d'objet null lors de l'enregistrement (événement OnItemUpdating) du premier élément d'édition dans un ListView?

TOUT aperçu est apprécié! Merci à l'avance ...

error Source:

var lvEditProjectSteps_hdnStepStatusId = (HiddenField) lvEditProjectSteps.EditItem.FindControl("lvEditProjectSteps_hdnStepStatusId"); 

est ici le côté ASPX de 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>&nbsp;</th> 
      <th>&nbsp;</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> 

Et le 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; 
    } 
} 

Répondre

2

Je résolu mon propre problème. Il semble y avoir un bug lors de la sélection d'un ListViewItem la modifier comme celui-ci (en utilisant l'exemple ci-dessus):

lvEditProjectSteps.EditItem 

mais pas lorsque vous utilisez cette méthode:

lvEditProjectSteps.Items[lvEditProjectSteps.EditIndex] 

espère que cela aide quelqu'un d'autre.