保存(OnItemUpdating事件)ListView中的第一個編輯項時,為什么會出現空對象引用錯誤?

[英]Why am I getting null object reference error when saving (OnItemUpdating event) the first edit item in a ListView?


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.

我收到錯誤“對象引用未設置為對象的實例”。在ListView中觸發Update事件后,在OnItemUpdating事件期間嘗試從EditItem引用HiddenField(lvEditProjectSteps_hdnStepStatusId以供將來參考)時。這僅發生在ListView中的FIRST項目上。我檢查了源代碼,HTML正在正確呈現。

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:

這是ListView的aspx端:

<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>

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

1 个解决方案

#1


I solved my own problem. There seems to be a bug when selecting a the edit ListViewItem like this (using the example above):

我解決了自己的問題。選擇像這樣的編輯ListViewItem似乎有一個錯誤(使用上面的例子):

lvEditProjectSteps.EditItem

but not when you use this method:

但不是在使用此方法時:

lvEditProjectSteps.Items[lvEditProjectSteps.EditIndex]

hope this helps someone else.

希望這有助於其他人。

关注微信公众号

注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:https://www.itdaan.com/blog/2009/01/05/7defa51a4a92b4b97e81676ca337d19d.html



 
粤ICP备14056181号  © 2014-2020 ITdaan.com