gpt4 book ai didi

c# - 用户控件之间的 ASP.NET 事件委托(delegate)

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:08 25 4
gpt4 key购买 nike

在 ASP.NET 页面上提供以下控件层次结构:

  • 页面
    • HeaderControl (用户控件)
      • TitleControl (服务器控件)
    • TabsControl (用户控件)
    • 其他控件

我试图在 TitleControl 中引发一个事件(或一些通知),该事件冒泡到 Page 级别。然后,我想(可选)注册一个事件处理程序在页面代码隐藏,它将采用 EventArgs 并修改上面示例中的 TabsControl。需要注意的重要一点是,如果连接了事件处理程序,这种设计将允许我将这些控件放入任何页面并使整个系统无缝工作。该解决方案不应涉及对 FindControl() 的调用,因为这会成为一个强关联。如果包含页面中没有定义任何处理程序,TitleControl 仍会引发该事件,但不会对其进行处理。

我的基本目标是使用基于事件的编程,这样我就可以将用户控件彼此分离。来自 TitleControl 的事件仅在某些情况下引发,这似乎是(在我看来)首选方法。但是,我似乎无法找到一种方法来彻底实现这一目标。

这是我的(糟糕的)尝试:

  1. 使用 HttpContext.Current.Items

    Add the EventArgs to the Items collection on TitleControl and pick it up on the TabsControl. This works but it's fundamentally hard to decipher since the connection between the two controls is not obvious.

  2. 使用反射

    Instead of passing events, look for a function on the container Page directly within TitleControl as in: Page.GetType().GetMethod("TabControlHandler").Invoke(Page, EventArgs); This will work, but the method name will have to be a constant that all Page instances will have to defined verbatim.

我敢肯定我想多了,肯定有一个使用委托(delegate)的更漂亮的解决方案,但我似乎想不出。有什么想法吗?

最佳答案

为了使每个控件都可重用并与其他控件分离,我一直采用这种方法:每个容器都知道它包含一个深层次的控件,但不知道包含它的容器。向上沟通,你使用事件是正确的。这为您提供了抽象层,并使您的所有控件都可重用。

话虽这么说,让我们来看看你的例子。您的 TitleControl 不包含任何内容,因此它只会触发事件。

您的 HeaderControl 引用您的 TitleControl 并处理它的事件。如果它不能完全处理您的 TitleControl 事件,那么让它声明并触发它自己的事件,并传递原始发送者和事件参数。

在您的页面级别,您的页面将处理您的 HeaderControl 事件。由于您的页面也是 TabsControl 的容器,因此在 HeaderControl 事件的事件处理程序内调用 TabsControl 中的公共(public)方法,然后传入冒泡的 EventArg 信息。

基本上,使用事件将事物冒泡,并使用公共(public)方法或属性将事物压低。

关于c# - 用户控件之间的 ASP.NET 事件委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2550283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com