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

时间:2012-02-29 17:17:34

标签: c# asp.net user-controls

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

你需要两件事:

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

    // ...
}

从Page,您将订阅您想要的活动或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);
    }

    // ...
}