从另一个控件访问用户控件

本文关键字:控件 用户 访问 另一个 | 更新日期: 2023-09-27 18:26:06

我有一个在 ASP.NET/C# 中实现的商店。 有一个页面 - ReservationProduct.aspx - 它有一个显示产品的控件 - BuyTourProduct - 另一个控件显示产品详细信息 - TourProductDetail

我知道保持两者解耦是一种很好的形式,但这是非常具体的商店用途。 我希望BuyTourProduct能够在TourProductDetail控件中将面板设置为可见或不使用 PanelName.Visible=true|false

如何在另一个控件的面板上设置一个控件属性? 我希望我说得足够清楚。

顺便说一下,这是我正在修改的几个第 3 个产品控件,因此更改它们是 2 个独立控件的事实对我们来说并不是一个真正的选择。

谢谢。

从另一个控件访问用户控件

最好在

用户控件 BuyTourProduct 中编写一个事件(例如:需要更新产品详细信息(然后,可以在放置控件的页面中处理此事件。

在 TourProductDetail 控件中,可以编写公共属性来隐藏和显示面板。

因此,在上述事件处理程序中,BuyTourProduct 事件处理程序在页面中调用 TourProductDetail 控件的 ShowHidePanel 属性。

在用户控件的上下文中,用户控件不知道其他用户控件或其内容。 您需要在页面上下文中与控件进行交互,因为页面知道这两个控件。

您将需要两件事:

  • 从 BuyTourProduct 控件触发的事件。
  • 与 TourProductDetail 控件中的 PanelName 交互的方法。

如果事件已经存在,请使用该事件;否则,它将要求您修改BuyTourProduct的源代码,并公开一个事件并在该代码中触发该事件。 然后,还需要从控件内调用此事件。

public class BuyTourProduct : UserControl
{
    // ...
    public delegate void MyHideEventDelegate();
    public event MyHideEventDelegate MyHideEvent;
    // ...
    public void SomeFunction()
    {
        if (MyHideEvent != null)
            MyHideEvent();
    }
    // ... 
}

接下来,您需要添加一个方法,以便在TourProductDetail中与PanelName进行交互:

public class TourProductDetail : UserControl
{
    // ...
    private Panel PanelName;
    // ...
    public void SetPanelNameVisible(Boolean visible)
    {
        PanelName.Visible = visible;
    }
    // ...
}

在主页上,您将订阅您想要的活动或MyHideEvent:

public partial class ReservationProduct : System.Web.UI.Page
{
    // ...
    protected void Page_Load(object sender, EventArgs e)
    {
        buyTourProduct.MyHideEvent += new BuyTourProduct.MyHideEventDelegate(buyTourProduct_MyHideEvent);
    }
    // ...
    void buyTourProduct_MyHideEvent()
    {
        tourProductDetail.SetPanelNameVisible(false);
    }
    // ...
}