Warum erhalte ich null Objektverweis Fehler beim Speichern (OnItemUpdating Ereignis), um das erste Bearbeitungselement in einem Listview?

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

Frage

Ich erhalte die Fehlermeldung „Der Objektverweis auf eine Instanz eines Objekts nicht festgelegt.“ beim Versuch, einen Hidden (lvEditProjectSteps_hdnStepStatusId für die Zukunft) aus dem EditItem während des OnItemUpdating Ereignisses nach dem Update-Ereignisse ausgelöst wird in einem Listview zu verweisen. Dies tritt nur auf das erste Element in der Listview. Ich habe die Quelle und die HTML korrekt gerendert wird.

ist Einsicht zu schätzen! Vielen Dank im Voraus ...

Quellfehler:

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

Hier ist die aspx Seite des 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>

Und das 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;
  }
}
War es hilfreich?

Lösung

Ich löste mein eigenes Problem. Es scheint ein Fehler zu sein, wenn eine der Bearbeitungs ListViewItem wie diese Auswahl (am Beispiel oben):

lvEditProjectSteps.EditItem

aber nicht, wenn Sie diese Methode verwenden:

lvEditProjectSteps.Items[lvEditProjectSteps.EditIndex]

Hoffnung hilft dies jemand anderes.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top