Вызов метода из UserControl

280
19 марта 2017, 03:02

День добрый! Мучаюсь который день, может подскажите?

В основной Форме есть функция

public void MessageReader(string Name)
{ .... }    

И в UserControl:

private void UsersBox_Click(object sender, EventArgs e)
{ 
   //MessageReader("Name"); - так вызвать метод не получается.
}

Искал в Google, но пока ответа не нашел... Как правильно?
Спасибо!

Answer 1

В UserControl-e:

public Form1 ParentForm { get; set; }
private void UsersBox_Click(object sender, EventArgs e)
{ 
  if (ParentForm != null)
    ParentForm.MessageReader("Name"); 
}

В форме:

userControl.ParentForm = this;
Answer 2

Правильно будет так:

private void UsersBox_Click(object sender, EventArgs e)
{ 
   if(this.Parent is NeededForm)//подставьте тип своей формы с методом
   {
       ((NeededForm)this.Parent).MessageReader("Name");
   }
}

или даже короче, если используете C#6

private void UsersBox_Click(object sender, EventArgs e)
{ 
   (this.Parent as NeededForm)?.MessageReader("Name");
}

В WinForms каждый контрол по умолчанию имеет ссылку на родительский контейнер. Исключением являются только формы, и то не всегда. Родитель вписывается автоматически, при добавлении одного контрола в коллекцию дочерних другого контрола. Работает и наоборот, вы можете указать родителя, и контрол автоматически будет помещен в коллекцию дочерних контролов родителя.

В коде выше все просто, проверяем что родитель нужного нам типа и вызываем метод, в противном случае ничего не делаем, ведь не у каждой формы есть описанный вами метод. Разумеется ваш контрол должен размещаться прямо на форме, без промежуточных панелей, таблиц и прочих контейнеров.

Если нужны промежуточные контейнеры, то либо вариант из соседнего ответа, либо меняем архитектуру на более гибкую и менее капризную.

READ ALSO
Неправильно прописывается путь к файлу

Неправильно прописывается путь к файлу

Пишу веб приложение используя ASPNET MVC

261
Создание игры Pacman на WPF

Создание игры Pacman на WPF

Задумал написать игру (простой PacMan)Сделал Grid сетку 30x30 присвоил нажатию клавиш (стрелочек) методы для перемещения картинки Pacman по гриду: как...

563