Как очистить панель в главной форме, через другую форму?

283
18 июля 2017, 17:32

Есть пример вопроса на видео (см. ниже).

Подскажите, как очистить panelMain в главной форме FormMain при нажатии на кнопку в FormSetting. Проблема в том, что стирать панель можно только через кнопки в главной форме.

Код который стирает панель через кнопки внутри главной формы:

public partial class FormMain : Form
{
    public FormMain()
    {
        InitializeComponent();
    }
    private Form f2;
    private void button1_Click(object sender, EventArgs e)
    {
        panelMain.Controls.Clear();
    }
    private void button2_Click(object sender, EventArgs e)
    {
        panelMain.Controls.Clear();
        if (f2 == null)
        {
            f2 = new FormSetting();
            f2.TopLevel = false;
            f2.Dock = DockStyle.Fill;
        }
        panelMain.Controls.Add(f2);
        f2.Show();
    }
}

Код со второй формы FormSetting, который не работает при сворачивании приложения. Появляется ошибка: "Ссылка на объект не указывает на экземпляр объекта." в строках Application.OpenForms:

    private Form f1;
    private void button1_Click(object sender, EventArgs e)
    {
        Application.OpenForms["FormMain"].Controls["panelMain"].Controls.Clear();
        if (f1 == null)
        {
            f1 = new FormGuid();
            f1.TopLevel = false;
            f1.Dock = DockStyle.Fill;
        }
        Application.OpenForms["FormMain"].Controls["panelMain"].Controls.Add(f1);
        f1.Show();
    }

Видео пример: https://www.youtube.com/watch?v=y99ENUpMlOc

Answer 1

Можно в метод открытия формы добавить:

f2.Tag = this;

То есть, получается следующее:

private void button2_Click(object sender, EventArgs e)
{
    panelMain.Controls.Clear();
    if (f2 == null)
    {
        f2 = new FormSetting();
        f2.TopLevel = false;
        f2.Tag = this;
        f2.Dock = DockStyle.Fill;
    }
    panelMain.Controls.Add(f2);
    f2.Show();
}

А из формы FormSetting можно обращаться к главной форме как (Tag as FormMain):

private Form f1;
private void button1_Click(object sender, EventArgs e)
{
    (Tag as FormMain).panelMain.Controls.Clear();
    if (f1 == null)
    {
        f1 = new FormGuid();
        f1.TopLevel = false;
        f1.Dock = DockStyle.Fill;       
    }
    (Tag as FormMain).panelMain.Controls.Add(f1);
    f1.Show();
}
READ ALSO
Где можно хранить dll файлы?

Где можно хранить dll файлы?

Доброй ночи - подскажите возможно ли такое реализовать и если можно в какую сторону копать

310
Смена обоев рабочего стола не всегда работает

Смена обоев рабочего стола не всегда работает

На windows 7 не всегда меняются обои, есть ли этому решение?

351
Совместное использование Attach() и Entry() в Entity Framework

Совместное использование Attach() и Entry() в Entity Framework

Заметил, что часто используют эти методы в связке:

280