繁体   English   中英

在嵌套中继器的页脚中找到控件? (.NET 2.0,C#)

[英]Find control inside footer of nested repeater? (.NET 2.0 , C#)

在嵌套中继器的页脚中查找数量框控件时,出现空引用错误。 执行OnItemCommand函数时发生错误(不是将数据绑定到转发器时发生的错误,这是我之前遇到但已解决的问题)。

我是一个新手,所以我不了解所有这些内容,并且在尝试过程中一直在尝试,但是我不知道为什么在foreach重复程序中包含 FindControl( msdn表示包含标头和中继器的页脚 !)在该中继器的页脚中找不到控件。 它让我发疯。

请帮忙!

更新:我更改了代码,但仍然遇到相同的问题-我错误地引用了ddl,并且我一直在获取未设置为对象实例的对象引用。

这是代码:

。净:

    <asp:Content ID="ProductRepeater" ContentPlaceHolderID="ProductRepeater" Runat="Server">
  <asp:Repeater ID="chairRepeater" OnItemCommand="productRepeater_ItemCommand" OnItemDataBound="chairRepeater_ItemDataBound" runat="server">
    <ItemTemplate>
      ...
      <asp:Repeater ID="variantRepeater" OnItemDataBound="variantRepeater_ItemDataBound" runat="server">
        <ItemTemplate>
          <li>
            <asp:RadioButton ID="radioBtn" GroupName="collections" runat="server"></asp:RadioButton>
            <asp:HiddenField ID="variantId" runat="server" />
            <asp:Literal ID="Image1" runat="server" />
            &nbsp;
            <asp:Literal ID="collectionName" runat="server" />
            &nbsp;&ndash;&nbsp;
            <asp:Literal ID="listPrice" runat="server" />
          </li>
        </ItemTemplate>
        <FooterTemplate>
        </ul>
          <asp:DropDownList ID="quantityLister" runat="server" />
        </FooterTemplate>
      </asp:Repeater>
         <asp:ImageButton ID="addToCart" ImageUrl="assets/images/_addtocart.gif"  runat="server" />
      </div>
      </div>
    </ItemTemplate>
    <SeparatorTemplate> <br />
    </SeparatorTemplate>
    <FooterTemplate> </FooterTemplate>
  </asp:Repeater>

C#:

protected void productRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    BasketHelper basketHelper = new BasketHelper(SiteContext.Current.ShoppingBasketName);
    OrderForm orderForm = basketHelper.GetOrderForm();
    bool basketUpdated = false;

    string catalogName = ConfigurationManager.AppSettings["PatioCatalogName"];
    string productId = ((HiddenField)e.Item.FindControl("productId")).Value;
    string variantId = "";

    Repeater variantRepeater = (Repeater)e.Item.FindControl("variantRepeater");
    foreach (RepeaterItem item in variantRepeater.Items)
    {
        RadioButton radioBtn = item.FindControl("radioBtn") as RadioButton;

        if (radioBtn.Checked == true)
        {
            variantId = ((HiddenField)item.FindControl("variantId")).Value;
        }
    }
        int quantity = 0;
        DropDownList quantityLister = (DropDownList)variantRepeater.FindControl("quantityLister");
        string ddlvalue = quantityLister.SelectedValue;
        int.TryParse(ddlvalue, out quantity);

        if (quantity > 0)
        {
            orderForm.LineItems.Add(new LineItem(catalogName, productId, variantId, quantity));
            basketUpdated = true;
        }
    if (basketUpdated)
    {
        basketHelper.Basket.Save();

        Response.Redirect(
            String.Format(
                CultureInfo.InvariantCulture,
                "~/cart.aspx?{0}={1}",
                SiteConstants.ActionQueryStringKey,
                SiteConstants.RunPipelineCartAction),
            true);
    }
}

这是我按下“购买”按钮时遇到的错误:

Server Error in '/' Application.
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

Line 116:            int quantity = 0;
Line 117:            DropDownList quantityLister = (DropDownList)variantRepeater.FindControl("quantityLister");
Line 118:            string ddlvalue = quantityLister.SelectedValue;
Line 119:            int.TryParse(ddlvalue, out quantity);
Line 120:


Source File: c:\Inetpub\patios\chaircovers.aspx.cs    Line: 118

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.]
   ChairCovers.productRepeater_ItemCommand(Object source, RepeaterCommandEventArgs e) in c:\Inetpub\patios\chaircovers.aspx.cs:118
   System.Web.UI.WebControls.Repeater.OnItemCommand(RepeaterCommandEventArgs e) +108
   System.Web.UI.WebControls.Repeater.OnBubbleEvent(Object sender, EventArgs e) +68
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.RepeaterItem.OnBubbleEvent(Object source, EventArgs e) +123
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.ImageButton.OnCommand(CommandEventArgs e) +111
   System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) +176
   System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

所以我改变了这个:

DropDownList quantityLister = (DropDownList)variantRepeater.FindControl("quantityLister");

对此:

DropDownList quantityLister = variantRepeater.Controls[variantRepeater.Controls.Count - 1].FindControl("quantityLister") as DropDownList;

而且有效。

自从我这样做已经有一段时间了,但是作为尝试的一个主意,

由于是嵌套的,因此html中嵌套的页眉或页脚控件的实际名称是外部中继器控件名称(I Think),下划线('_')和内部页眉/页脚名称的串联控制...您是否正在使用此功能?

第二条建议:更改年份代码

foreach (RepeaterItem item in variantRepeater.Items)
{
      decimal quantity = 0;        
      decimal.TryParse(((DropDownList)item.FindControl(
             "quantityLister")).SelectedValue, out quantity); 
      if (quantity > 0)
      {   
          string variantId = ((HiddenField)item.FindControl("variantId")).Value;
          orderForm.LineItems.Add(
                 new LineItem(catalogName, productId, variantId, quantity));
          basketUpdated = true; 
      }
}

并将其更改为:

foreach (RepeaterItem item in variantRepeater.Items)
{
      decimal quantity = 0;        
      decimal.TryParse(((DropDownList)item.FindControl(
             "quantityLister")).SelectedValue, out quantity); 
      if (quantity > 0)
      { 
          if (item == null)
              throw new ApplicationException(
                  "Can't locate RepeaterItem");
          object obj = item.FindControl("variantId");
          if (obj == null)
          {
              string sNL = Environment.NewLine;
              StringBuilder sb = new StringBuilder(
                     "Can't locate variantId HiddenField" + sNL +
                     "item Controls are:" + sNL); 
              foreach(Control ctrl in item.Controls)
                  sb.Append(ctrl.Name + sNL);

              throw new ApplicationException(sb.ToString());                
          }
          if (!(obj is HiddenField))
              throw new ApplicationException(
                  "variantId is not a HiddenField");
          HiddenField hfld = obj as HiddenField;

          string variantId = hfld.Value;
          orderForm.LineItems.Add( new LineItem(
                 catalogName, productId, variantId, quantity));
          basketUpdated = true; 
      }
}

再次运行,看看错误是什么...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM