Как найти элемент управления на странице содержимого из динамического пользовательского элемента управления - PullRequest
0 голосов
/ 05 декабря 2018

Я получаю исключение нулевой ссылки при попытке найти элемент управления на кнопке.У меня есть настройка корзины покупок, где у меня есть страница контента (.aspx) на основе главной страницы.На странице содержимого есть элемент-заполнитель, в котором я динамически добавляю пользовательские элементы управления (по одному элементу управления на продукт, каждый с кнопкой «Добавить в корзину» внутри него).

Когда пользователь нажимает кнопку для добавлениятовар в корзину, я могу успешно добавить его в корзину, затем я подсчитываю количество товаров в корзине и, если их больше 1, пытаюсь показать кнопку «Оформить заказ» или, если ее нет в корзине, скрыть ее.

Я использую FindControl, но получаю нулевую ссылку.Почему он не может найти кнопку оформления заказа?Мой текущий код ниже:

MASTER PAGE (template.Master):

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="template.master.cs" Inherits="OUWP.template" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
    <head runat="server"></head>
<body>
    <form id="form1" runat="server">
        <asp:ContentPlaceHolder ID="m_cph_body" runat="server"></asp:ContentPlaceHolder>
    </form> 
</body>
</html>

CONTENT PAGE (shop.aspx)

<%@ Page Title="" Language="C#" MasterPageFile="~/template.Master" AutoEventWireup="true" CodeBehind="shop.aspx.cs" Inherits="OUWP.shop" %>
<%@ MasterType VirtualPath="~/template.Master" %>

<asp:Content ID="Content2" ContentPlaceHolderID="m_cph_body" runat="server">
    <asp:PlaceHolder ID="Catalogue" runat="server">
        <!-- this is where the user controls are dynamically generated-->
    </asp:PlaceHolder>
    <asp:Panel ID="pnl_Basket" runat="server">
        <div>
            <asp:LinkButton ID="lbtnCheckout" runat="server">Continue to Checkout</asp:LinkButton>
        </div>
    </asp:Panel>
</asp:Content>

Страница управления пользователем (купленный продукт).ascx)

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PurchasableProduct.ascx.cs" Inherits="OUWP.CustomControls.PurchasableProduct" %>

<asp:UpdatePanel ID="udpBody" runat="server">
    <ContentTemplate>
        <asp:Panel ID="pnlPurchasableProduct" runat="server">
            <asp:LinkButton ID="lbtnAddLine" runat="server" OnClick="lbtnAddLine_Click"></asp:LinkButton>
        </asp:Panel>
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="lbtnAddLine" />
    </Triggers>
</asp:UpdatePanel>

КОД УПРАВЛЕНИЯ ПОЛЬЗОВАТЕЛЕМ В ПОСЛЕДУЮЩЕМ КОДЕКЕ (PurchaseasableProduct.ascx.cs)

protected void lbtnAddLine_Click(object sender, EventArgs e)
{
    // try to find checkout button on parent page of control
    System.Web.UI.Page page = (System.Web.UI.Page)this.Page;
    LinkButton Target1 = (LinkButton)page.FindControl("lbtnCheckout");

    // count the items in the cart (saved in session variable)
    DataTable dt = (DataTable)Session["varDataTableCart"];
    Int32 ItemCount = 0;
    Int Line Quantity = 0;
    foreach (DataRow dr in dt.Rows)
    {
        Int32 LineQuantity = Convert.ToInt32(dt.Rows[dt.Rows.IndexOf(dr)]["Quantity"].ToString());
        ItemCount = ItemCount + LineQuantity;
    }

    // if 1 or more items in cart, try to make button visible
    if (ItemCount > 0)
    {
        Target1.Visible = true;
    }
    // otherwise no items in cart, so try to hide checkout button
    else
    {
        Target1.Visible = false;
    }
}

Я также пытался перейти на главную страницу, используя приведенный ниже код, но этотоже не работал:

MasterPage mp1 = (MasterPage)page.Master;
LinkButton Target1 = (LinkButton)mp1.Page.FindControl("lbtnCheckout");

1 Ответ

0 голосов
/ 05 декабря 2018

Хорошо, так что по счастливой случайности я попробовал этот код, и он сработал, и нашел мою кнопку.Использование «родителя» текущего элемента управления.

LinkButton Target1 = (LinkButton) this.Parent.FindControl ("lbtnCheckout");

...