用户控件之间的ASP.NET事件委派

时间:2010-03-31 03:16:00

标签: c# asp.net events user-controls delegates

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

  • 网页
    • HeaderControl(用户控件
      • TitleControl(服务器控制
    • TabsControl(用户控件
    • 其他控件

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

我的基本目标是使用基于事件的编程,以便我可以将用户控件彼此分离。 TitleControl中的事件仅在某些情况下引发,这似乎是(在我的脑海中)首选方法。但是,我似乎无法找到一种干净利落的方法。

以下是我的(差)尝试:

  1. 使用HttpContext.Current.Items

      

    将EventArgs添加到TitleControl上的Items集合中,并在TabsControl上将其拾取。这有效,但由于两个控件之间的连接不明显,因此从根本上难以破译。

  2. 使用反思

      

    不是传递事件,而是直接在TitleControl中查找容器页面上的函数,如下所示:   Page.GetType().GetMethod("TabControlHandler").Invoke(Page, EventArgs);   这将有效,但方法名称必须是一个常量,所有Page个实例必须逐字定义。

  3. 我确信我过度思考这个问题并且必须有一个更漂亮的解决方案使用委托,但我似乎无法想到它。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

为了使每个控件可重用并与其他控件分离,我总是采用这种方法:每个容器将知道它包含一层深度的控件,而不是包含它的容器。要进行沟通,您在使用事件时是正确的。这提供了您的抽象层,并使您的所有控件都可重用。

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

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

在您的页面级别,您的页面将处理您的HeaderControl个活动。由于您的网页也是TabsControl的容器,因此在您的TabsControl事件的事件处理程序内的HeaderControl中调用公共方法,并传入冒充的EventArg信息。< / p>

基本上,使用事件来搞砸事情,并使用公共方法或属性来推倒事物。

答案 1 :(得分:0)

你是否想在these lines做一些事情?

答案 2 :(得分:0)

您可以让Page实现一个包含事件的接口。然后让选项卡控件查看页面是否实现了所需的界面。如果确实如此,则会挂钩事件。

错过了关于标题控件的部分。标题控件还必须通过接口方法使页面自己知道。

然后你可以在某个时刻挂钩事件(也许是加载事件)。这当然只有在加载事件之前添加到页面的控件才有效。

答案 3 :(得分:0)

HeaderControl可以公开TabsControl消耗的事件。我已经回复了similar question before(附上了一个示例项目)。