لماذا أحصل على باطل خطأ مرجع كائن عند حفظ (OnItemUpdating الحدث) البند الأول تحرير في ListView؟

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

سؤال

وأنا الحصول على الخطأ "كائن مرجع لم يتم تعيين إلى مثيل كائن". عند محاولة الرجوع إلى HiddenField (lvEditProjectSteps_hdnStepStatusId للرجوع إليها في المستقبل) من EditItem خلال هذا الحدث OnItemUpdating بعد وقع الحدث تحديث في ListView. هذا يحدث فقط على البند الأول في ListView. راجعت المصدر ويتم تقديمها في HTML بشكل صحيح.

وهو محل تقدير أي تبصر! شكرا مقدما ...

والخطأ المصدر:

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

وهنا الجانب ASPX من يكون 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>

والتعليمات البرمجية الخلفية:

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;
  }
}
هل كانت مفيدة؟

المحلول

وأنا تحل مشكلة بلدي. ويبدو أن هناك خلل عند اختيار وتحرير ListViewItem مثل هذا (باستخدام المثال أعلاه):

lvEditProjectSteps.EditItem

ولكن ليس عند استخدام هذا الأسلوب:

lvEditProjectSteps.Items[lvEditProjectSteps.EditIndex]

وأمل أن يساعد هذا شخص آخر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top