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" />
<asp:Literal ID="collectionName" runat="server" />
–
<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
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.) –
Essayez ma modification et voir ce qui se passe –
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! –