0

ネストされたリピーターのフッターで数量ボックス コントロールを検索すると、null 参照エラーが発生します。OnItemCommand関数が実行されたときにエラーが発生します(データがリピーターにバインドされているときではありません。これは以前に発生した問題でしたが修正されました)。

私は初心者なので、このすべてを理解しているわけではありません。私はそれを進めようとしていますが、foreach repeateritem 内の 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
4

2 に答える 2

1

So I changed this:

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

to this:

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

and it worked.

于 2009-12-30T21:52:16.807 に答える
0

これをやってからしばらく経ちましたが、試してみるアイデアとして、

ネストされているため、html 内のネストされたヘッダーまたはフッター コントロールの実際の名前は、外側のリピーター コントロール名 (私は思う)、アンダースコア ('_')、および内側のヘッダー/フッターの名前を連結したものです。コントロール...これを検索で使用していますか?

2 番目の提案: 年コードを変更する

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

もう一度実行して、エラーの内容を確認してください...

于 2009-12-16T18:50:11.013 に答える