Обычный шаблон для такого рода вещей - для MyTreeView
событие FooClicked
.
Это происходит потому, что то, что происходит при нажатии foo
, полностью выходит за пределы области внимания MyTreeView
. Это проблема Form1
, так что пусть Form1
справится с этим. Просто создайте событие и позвольте форме добавить обработчик для него. OnClickMethod
все равно будет определено в Form1
.
Создание пункта меню
ToolStripMenuItem toolStripMenuItem =
new ToolStripMenuItem(text: "foo", image: null, onClick: (s, e2) => OnFooClicked())
{
CheckOnClick = true
};
(s, e2) => OnFooClicked()
- это обработчик событий, который вызывает OnFooClicked()
. Если этот синтаксис настолько странен, что мешает вам, дайте мне знать, и я перепишу его, чтобы избежать путаницы.
Определение события в MyTreeView:
public event EventHandler FooClicked;
protected void OnFooClicked()
{
// C#7. If this fails to compile with some weird error let me know and I'll
// provide a backwards compatible version.
FooClicked?.Invoke(this, EventArgs.Empty);
}
Теперь в Form1 просто подключите обработчик событий для myTreeView1.FooClicked
:
void myTreeView1_FooClicked(object sender, EventArgs e)
{
// OnClickMethod() is no longer an event handler. It's just a protected
// method that does stuff. I'm 99% sure its sender and e parameters were
// never used. Writing all your logic directly in event handlers is bad
// practice because it leads to weird noise in the code and bizarre,
// inappropriate method names.
OnClickMethod();
}
Насколько я понимаю, это требование:
- Клики пользователей
toolStripMenuItem1
- Form1 слышит об этом и что-то делает в ответ.
В прошлом Form1 непосредственно создавала toolStripMenuItem
, поэтому она непосредственно предоставляла обработчик щелчков для самого пункта меню.
Теперь Form1 не создает toolStripMenuItem
, поэтому он не может предоставить обработчик. Но все, что беспокоит Form1 - это когда кто-то нажимает на этот пункт меню. Таким образом, мы можем сделать это, создав новое событие, которое принадлежит MyTreeView. Теперь, когда нажимается toolStripMenuItem
, его событие click все еще вызывается, но новый обработчик для этого события click вызывает другое событие , событие, к которому имеет доступ Form1. Таким образом, Form1 обрабатывает это другое событие. Это другое событие возникает в ответ на то же действие пользователя, что и раньше: пункт меню, по которому щелкают.
Единственное, чего вам не хватает, это добавить обработчик к событию, вызванному myTreeView1
в вашей форме. Это делается на панели свойств элемента управления в конструкторе форм Visual Studio. Там вкладка События. В этом нет ничего волшебного, особенного или секретного. Это событие, как и любое другое событие. Просто обычное событие.