【问题标题】:Custom Event on Custom Control自定义控件上的自定义事件
【发布时间】:2010-09-08 15:09:55
【问题描述】:

我有一个自定义控件,我们称之为“TheGrid”。

TheGrid 的控件中有另一个控件,我们称之为“GridMenu”。

GridMenu 在它自己的控件集合中有一个按钮控件。

我想让使用此控件的开发人员能够将页面级方法与 GridMenu ala 深处的该按钮的 OnClick 相关联:

<customcontrols:TheGrid id="tehGridz" runat="server" onGridMenuButtonClick="mypagemethod" />

【问题讨论】:

    标签: c# events custom-controls


    【解决方案1】:

    在 GridMenu(我假设它是另一个自定义控件)上,通过将事件 ButtonClick 声明为公共来公开它:

    public event EventHandler ButtonClick;
    

    如果您愿意,可以通过定义委托和自定义事件参数类来创建自定义事件处理程序。在此控件的逻辑中,您将需要引发事件(可能在 GridMenu 上包含的按钮的 Clicked 事件处理程序中;事件可以级联)。使用 C# 编码,您需要在引发事件之前检查事件是否不为空(意味着至少附加了一个处理程序)。

    现在该事件对 TheGrid 可见,其中包含您的 GridMenu。现在您需要创建一个“传递”以允许 TheGrid 的用户附加处理程序,而无需了解 GridMenu。您可以通过在 TheGrid 上指定一个类似于属性的事件来执行此操作,并从内部事件附加和分离处理程序:

    public event EventHandler GridMenuButtonClick
    {
       add{ GridMenu.ButtonClick += value;}
       remove { GridMenu.ButtonClick -= value;}
    }
    

    从包含 TheGrid 控件的控件标记中,您现在可以通过按照您想要的方式将其附加到 OnGridMenuButtonClicked 来指定事件处理程序。

    【讨论】:

    • 我曾认为可以采用这样的方法,但无论我做什么,我都无法获得识别 OnGridMenuButtonClicked 的智能。
    • @D.Forrest:您必须使用 GridMenuButtonClick 而不是 OnGridMenuButtonClicked
    • 我当然明白。我实际上将我的事件称为“OnSearchClick”。但它绝对不是通过标记可见的,并且在添加/删除声明的调试中的断点没有被命中。
    • 好吧,SKINDER 说的是 ASP.NET 在幕后生成一个“On”包装器,用于从标记附加处理程序。当您将自定义事件设置为 OnSearchClick 时,您必须将 OnOnSearchClick 指定为要在标记中附加处理程序的事件。尝试将您在 GridMenu 的代码隐藏中定义的事件更改为“SearchClick”;这将允许您从标记将处理程序附加到 OnSearchClick。
    • 感谢基思的澄清。任务完成。
    【解决方案2】:

    您可以使用委托为此事件注册事件处理程序。请参阅以下 MSDN 文章:

    http://msdn.microsoft.com/en-us/library/system.eventhandler%28VS.71%29.aspx

    http://msdn.microsoft.com/en-us/library/aa720047%28v=VS.71%29.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多