【问题标题】:How can I pass EventHandler as a method parameter如何将 EventHandler 作为方法参数传递
【发布时间】:2015-03-10 02:50:21
【问题描述】:

我正在尝试编写一个通用方法来处理单击事件,并且我希望允许用户将他自己的方法作为单击事件传递。 像这样的:

public static void BuildPaging(
    Control pagingControl, short currentPage, short totalPages,  ???)
{
    for (int i = 0; i < totalPages; i++)
    {
        LinkButton pageLink = new LinkButton();
        ...
        pageLink.Click += ???;
        pagingControl.Controls.Add(paheLink);
    }
}

我知道这是可能的,但我不记得怎么做......

【问题讨论】:

标签: c# events delegates event-handling


【解决方案1】:

只需使用事件处理程序的类型作为参数类型:

public static void BuildPaging(Control pagingControl
                              , short currentPage
                              , short totalPages
                              , EventHandler eh // <- this one
                              )
{
    for (int i = 0; i < totalPages; i++)
    {
        LinkButton pageLink = new LinkButton();
        ...
        pageLink.Click += eh;
        pagingControl.Controls.Add(paheLink);
    }
}

注意:完成后不要忘记删除事件处理程序,否则可能会泄漏内存!

【讨论】:

  • @LiranFriedman:没必要。 EventHandler 已经是代表了。查看它的签名。
【解决方案2】:

这样的?

void DoWork(Action<object, EventArgs> handler)
{
    if (condition)
    {
        OnSomeEvent(this, EventArgs.Empty);
    }
}

void OnSomeEvent(object sender, EventArgs e)
{

}

将其作为参数传递:

DoWork(OnSomeEvent);

【讨论】:

  • 但是点击事件不接受“handler”作为有效值
【解决方案3】:

您可以将动作委托传递给函数

public static void BuildPaging(Control pagingControl, 
            short currentPage, short totalPages,  Action<type> action)

  for (int i = 0; i < totalPages; i++)
{
    LinkButton pageLink = new LinkButton();
    ...
    pageLink.Click += action;
    pagingControl.Controls.Add(paheLink);
}

【讨论】:

    猜你喜欢
    • 2013-06-21
    • 2011-10-14
    • 2015-01-22
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    相关资源
    最近更新 更多