Существует несколько решений для взаимодействия между элементами управления. Элементы управления - это классы, и, как и любой другой класс, они могут взаимодействовать друг с другом, используя свои открытые свойства и методы или используя некоторый посредник.
В этом случае ваши элементы управления не должны знать друг друга и не должны напрямую взаимодействовать друг с другом:
- Они могут попросить другой объект, который знает оба элемента управления, выполнить работу за них.
- Или они могут подать уведомление о своем запросе, и тот, кто подписался на это уведомление, будет его обслуживать.
Чтобы попросить другой объект выполнить работу за них, у вас есть несколько решений. В качестве примера вы можете реализовать конкретный интерфейс в родительской форме и в дочерних элементах управления, привести родителя к этому конкретному интерфейсу и вызвать определенный метод, который сделает эту работу за вас.
Для получения уведомления о запросе простое решение основывается на событиях. Вы можете создать событие в дочернем элементе управления и вызвать его, когда вам нужно, чтобы родитель сделал что-то для вас. Затем в родительском подпишитесь на это событие и сделайте задание.
Пример - Использование события
Я предполагаю, что у вас UserControl1
есть Button1
внутри, и вы обработали Click
событие Button1
. Затем вы можете создать Button1Clicked
событие и поднять его, когда Button1
нажмет:
public event EventHandler Button1Clicked;
private void Button1_Click(object sender, EventArgs e)
{
Button1Clicked?.Invoke(this, e);
}
Затем в родительской форме подпишитесь на событие и делайте что хотите:
private void userControl11_Button1Clicked(object sender, EventArgs e)
{
//Hide userControl11 and show userControl21
}
Пример - Использование интерфейса
Полагаю, у вас есть интерфейс, имеющий несколько стандартных методов:
public interface IDoSomething
{
void DoSomething();
void DoSomethingElse();
}
И вы реализовали интерфейс в родительской форме:
public class Form1: Form, IDoSomething
{
// ...
public void DoSomething()
{
//Hide userControl11 and show userControl21
}
public void DoSomethingElse()
{
// ...
}
}
Тогда у вас пользовательский контроль:
private void Button1_Click(object sender, EventArgs e)
{
var f = FindForm() as IDoSomething;
if(f!=null)
f.DoSomething();
}