C# Winforms - Переключить состояния жизнеспособности от одного пользовательского контроля к другому пользовательскому контролю? - PullRequest
0 голосов
/ 23 марта 2020

Я приложил пример того, что я пытаюсь выполнить sh с моим кодом ниже. Если возможно, кто-нибудь может написать фрагмент или объяснить, как это может работать? Я пробовал несколько разных способов, и ни одна из моих попыток не увенчалась успехом (я продолжаю получать сообщения об ошибках или что пользовательский контроль не распознается).

В настоящее время пытается получить UserControl1.Button1 для переключения состояния видимости на UserControl2.

Иерархия:

  1. Форма 1
    1. UserControl1
      1. Button1
    2. UserControl2
      1. Button1

Я могу получить варианты этого для работы, показанной ниже, но usercontrol to usercontrol, кажется, требует некоторых дополнительных шагов. Помогите!

    private void button1_Click(object sender, EventArgs e)
    {
        this.Hide();
    }

    private void HIDE2_Click(object sender, EventArgs e)
    {
        userControl21.Hide();
    }

1 Ответ

0 голосов
/ 23 марта 2020

Как отметил @ hans-passant.

Использование событий дает нам простой способ использовать шаблон наблюдателя.

Реализация пользовательского Event In UserControl1 и вызов это событие (уведомление наблюдателей об изменении) при нажатии кнопки, чтобы скрыть второй элемент управления:

public partial class UserControl1 : UserControl
{
    public event EventHandler HideRequested;

    ...

    private void button1_Click(object sender, EventArgs e)
    {
        if (HideRequested != null)
        {
            HideRequested.Invoke(this, EventArgs.Empty);
        }
    }

}

В форме Form1 присоединить к событию, реализовав обработчик события:

    public Form1()
    {
        InitializeComponent();
        userControl11.HideRequested += userControl11_HideRequested;
    }

    void userControl11_HideRequested(object sender, EventArgs e)
    {
        userControl21.Hide();
    }

Конечно, есть и другие способы для достижения этой цели, но любой другой способ, вероятно, привнесет связывание в ваш код. Например, это также верно (изменяя модификатор доступа пользовательского элемента управления 2 на publi c):

    private void button1_Click(object sender, EventArgs e)
    {
        (Parent as Form1).userControl21.Hide();
    }

Вы также можете думать о чем-то вроде этого: (тогда вам не нужно измените модификатор доступа USerControl2 на publi c)

в Form1:

    public void HideUserControl2()
    {
        userControl21.Hide();
    }

и в UserControl1 button_click:

    private void button1_Click(object sender, EventArgs e)
    {
        (Parent as Form1).HideUserControl2();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...