Perché viene visualizzato un errore di riferimento a un oggetto null durante il salvataggio (evento OnItemUpdating) del primo elemento di modifica in un ListView?

StackOverflow https://stackoverflow.com/questions/414502

Domanda

Ricevo l'errore " Riferimento oggetto non impostato su un'istanza di un oggetto. " quando si tenta di fare riferimento a un HiddenField (lvEditProjectSteps_hdnStepStatusId per riferimento futuro) da EditItem durante l'evento OnItemUpdating dopo che l'evento Update si attiva in un ListView. Ciò si verifica solo sul PRIMO elemento in ListView. Ho controllato la fonte e l'HTML viene visualizzato correttamente.

QUALSIASI approfondimento è apprezzato! Grazie in anticipo ...

Errore di origine:

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

Ecco il lato aspx di 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>

E il 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;
  }
}
È stato utile?

Soluzione

Ho risolto il mio problema. Sembra che ci sia un bug quando si seleziona un oggetto ListView di modifica in questo modo (usando l'esempio sopra):

lvEditProjectSteps.EditItem

ma non quando usi questo metodo:

lvEditProjectSteps.Items[lvEditProjectSteps.EditIndex]

spero che questo aiuti qualcun altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top