Вызывание событий внешнего объекта в C # - PullRequest
7 голосов
/ 26 апреля 2009

Если actions - это Panel, могу ли я вызвать событие Click его родителя? В данный момент у меня есть этот код, но событие Click не является методом, поэтому этот код недействителен.
Кто-нибудь знает, как мне этого добиться?

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

Ответы [ 5 ]

9 голосов
/ 26 апреля 2009

Невозможно поднять C # event напрямую из другого class (даже если это public). Вы можете предоставить метод (с достаточным модификатором доступа), который поднимает event от вашего имени, и вызвать этот метод в другом class.

Кстати, это возможно с помощью отражения, но я считаю, что это грязный взлом.

6 голосов
/ 26 апреля 2009

Большинство типов в CLR, которое вызывает события, имеет защищенный метод On [EventName], который заботится о возникновении события. Вы можете вызвать этот защищенный метод "извне", используя Reflection:

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

 onClickMethod.Invoke(parent, new object[] { e });
2 голосов
/ 08 февраля 2010

Я реализовал это, используя методы отражения и расширения, чтобы я мог просто вызвать (в данном случае) событие щелчка 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 (который вызовет событие
1 голос
/ 27 апреля 2009

Единственная причина, по которой я могу подумать, почему вы захотите вызвать событие Click, - это если вы имитируете пользовательский ввод. Вы работаете над автоматизированным тестовым драйвером или чем-то в этом роде? Если это так, то могут быть лучшие решения, чем использование кода с помощью вспомогательных методов только для тестирования. Это появляется первым в Google, я понятия не имею, хорошо ли это.

Если вы пытаетесь сделать это как своего рода управление потоком в самом приложении, я бы сделал шаг назад, чтобы посмотреть, правильно ли это вообще делать - это вроде "плохо пахнет".

1 голос
/ 26 апреля 2009

В зависимости от того, какую платформу вы используете, возможно, вам не нужно вручную вызывать событие click для родителя, WPF и ASP.NET , например, всплывающие события вверх дерево элементов.

Если это не вариант, вы можете делать то, что предлагает Мехрдад.

...