8

如果actions是一个小组,我可以提出Click它的父母事件吗?我现在有这段代码,但Click事件不是方法,所以这段代码无效。
有谁知道我怎么能做到这一点?

actions.Click += delegate(object Sender, EventArgs e)
{
    ((Panel)Sender).Parent.Click();
}
4

5 回答 5

10

不可能event直接从另一个提出 C# class(即使它是public)。您可以提供一个方法(具有足够的访问修饰符),event代表您提出 并在另一个中调用该方法class

顺便说一句,这可以通过反射实现,但我认为这是一个肮脏的黑客行为。

于 2009-04-26T07:10:03.413 回答
5

CLR 中引发事件的大多数类型都有一个受保护的 On[EventName] 方法,该方法负责引发事件。您可以使用反射“从外部”调用此受保护的方法:

 Control parent = ((Control)sender).Parent;
 Type parentType = parent.GetType();
 MethodInfo onClickMethod = parentType.GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic);

 onClickMethod.Invoke(parent, new object[] { e });
于 2009-04-26T07:26:27.990 回答
2

我使用反射和扩展方法实现了这一点,因此我可以通过调用(在这种情况下)调用 LinkLabel 点击事件:

var link = new LinkLabel()'
link.Text = "Some link";
link.click();

click() 方法是 C# 扩展方法:

    public static void click(this LinkLabel linkLabel)
{
    var e = new LinkLabelLinkClickedEventArgs((LinkLabel.Link)(linkLabel.prop("FocusLink")));
    linkLabel.invoke("OnLinkClicked", e);
}

它使用另一种扩展方法来:

  • 从 LinkLabel 获取私有属性(需要创建 LinkLabelLinkClickedEventArgs 对象)
  • 调用 OnLinkClicked 方法(这将触发事件
于 2010-02-07T23:58:37.000 回答
1

根据您使用的框架,您可能不必手动调用父级、WPFASP.NET上的单击事件,例如元素树上的气泡事件。

如果这不是一个选项,您可以像 Mehrdad 建议的那样做。

于 2009-04-26T07:19:09.897 回答
1

我能想到的为什么要引发 Click 事件的唯一原因是如果您正在模拟用户输入。您是否正在开发自动测试驱动程序或类似的东西?如果是这样,可能有比使用仅测试辅助方法玷污代码更好的解决方案。 首先出现在谷歌中,我不知道它是否有任何好处。

如果您试图在应用程序本身中将此作为一种流控制,我会退后一步,看看这是否是正确的做法——它有点“闻起来很糟糕”。

于 2009-04-26T20:20:05.713 回答