2009-12-16 5 views
0

Je reçois des erreurs de référence null lorsque vous recherchez un contrôle de boîte de quantité dans le pied de page d'un répéteur imbriqué. L'erreur se produit lorsque la fonction OnItemCommand est exécutée (pas lorsque les données sont liées au répéteur, problème que j'ai rencontré auparavant mais résolu). Je suis un débutant, donc je ne comprends pas tout cela, et j'essaie de le faire comme je vais, mais je ne sais pas pourquoi FindControl à l'intérieur d'un répéteur foreach (msdn says includes the header and footer of a repeater!) ne trouverait pas le contrôle dans le pied de ce répéteur. Ça me rend fou.Trouver le contrôle à l'intérieur d'un pied de page d'un répéteur imbriqué? (.NET 2.0, C#)

Aidez s'il vous plaît! MISE À JOUR: J'ai changé le code mais j'ai toujours le même problème - Je référence incorrectement le ddl et je continue à obtenir la référence d'objet non définie à une instance d'un objet.

Voici le code:

.NET:

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

Et voici l'erreur que je reçois quand je presse mon bouton d'achat:

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 

Répondre

1

Je changé cette :

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

à ceci:

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

et cela a fonctionné.

0

Il a été un moment que je l'ai fait, mais comme une idée d'essayer,

Comme il est imbriqué, le nom réel de l'en-tête imbriqué ou le contrôle de bas de page dans le code html, est une concaténation du contrôle de répéteur externe name, (I Think), un trait de soulignement ('_'), et le nom du contrôle interne d'en-tête/pied de page ... Utilisez-vous ceci dans votre recherche?

Deuxième suggestion: Code Change an

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

Et changer pour:

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

exécuter à nouveau et voir ce que l'erreur est ...

+0

Je ne suis pas, j'utilise simplement l'ID du contrôle ("quanitityLister"); est-ce que l'ID du contrôle que j'essaye de saisir change quand j'exécute la fonction du répéteur parent? (Je n'utilise probablement pas la bonne terminologie, je m'excuse.) –

+0

Essayez ma modification et voir ce qui se passe –

+0

J'ai depuis réalisé que la quantité est pour le groupe d'articles dans la varianteRepeater, et que je ne cherche pas une quantité pour chaque élément de variantRepeater, je viens de mettre à jour mon code, mais je reçois toujours la même erreur: la référence d'objet n'est pas définie sur une instance d'un objet. Permettez-moi de poster mon code mis à jour. Je ne peux pas sembler obtenir la valeur sacrée de la liste déroulante dans mon pied de page! –

Questions connexes