Хобрук: Ваш путь к мастерству в программировании

С# открыть форму в панели

У меня 3 формы. Основная форма, форма2 и форма3.

Основная форма содержит большую панель, в которой форма 2 отображается при запуске программы.

Я делаю это с помощью следующего кода в моей основной форме, который отлично работает:

   private Boolean loaded = false;
   private void MainForm_Load(object sender, EventArgs e)
    {
        if (!loaded)
        {
            openChildForm(new Form2());
            loaded = true;
        }
    }

 
    public Form activeForm = null;
    public void openChildForm(Form childForm)
    {
        if (activeForm != null)
        { 
            activeForm.Close();
        }

        activeForm = childForm;
        childForm.TopLevel = false;
        panelMain.Controls.Add(childForm);
        panelMain.Tag = childForm;
        childForm.BringToFront();
        childForm.Show();
    }

Теперь я хочу добавить кнопку в Form2 (которая все еще отображается на панели). Когда я нажимаю эту кнопку, Form2 должен удалить себя из панели Mainform, а вместо этого Form3 должен отображаться на этой панели MainForm. Я попробовал это со следующим кодом в Form2 в Buttonclick:

new Mainform().openChildForm(new Form3());

Однако это не работает. Он по-прежнему отображает Form2 на панели и не отображает Panel3. В Mainform также говорится, что activeForm имеет значение null. Я думаю, это из-за нового вызова MainForm(). Могу ли я просто получить доступ к MainForm без создания нового экземпляра?

30.03.2021

Ответы:


1

Теперь я хочу добавить кнопку в Form2 (которая все еще отображается на панели). Когда я нажимаю эту кнопку, Form2 должен удалить себя из панели Mainform, а вместо этого Form3 должен отображаться на этой панели MainForm.

Могу ли я просто получить доступ к MainForm без создания нового экземпляра?

В Form2 вы можете привести ParentForm в MainForm, а затем вызовите openChildForm() для этого:

// ... in Form2 ...
private void button1_Click(object sender, EventArgs e)
{
    MainForm mf = this.ParentForm as MainForm;
    if (mf != null)
    {
        mf.openChildForm(new Form3());
    }
}
30.03.2021
  • Это отлично работает, спасибо :) 30.03.2021
  • Новые материалы

    Еженедельный выпуск React 75
    Добро пожаловать в 75-й выпуск React Weekly, еженедельный обзор последних ссылок и руководств по React и React Native. Посетите Купить кофе , чтобы найти способы поддержать React Weekly, или..

    (Почти) полнофункциональная реализация Gumbel MuZero в Джулии.
    TLDR; Gumbel Muzero — это современный алгоритм обучения с подкреплением. Он достиг сверхчеловеческой производительности во многих настольных играх и даже, что более впечатляюще, в Atari..

    Передача нейронного стиля в браузерах с использованием Angular и WebDNN
    В последние годы глубокое обучение привлекло большое внимание из-за его безупречной производительности при обучении на обширных данных и высокой точности при выводе. Развертывание этих алгоритмов..

    Шифр Цезаря в C
    Шифр Цезаря  — один из самых простых и широко известных методов шифрования. Он включает в себя сдвиг каждой буквы в сообщении на определенное количество позиций в алфавите. В этой статье мы..

    Исследовательский анализ данных (EDA)
    Что такое ЭДА? Анализ данных, который ищет закономерности в данных, известен как исследовательский анализ данных. Это похоже на беглый просмотр данных, чтобы найти наиболее важные..

    1x1 Convolution: демистификация
    Чтобы пролить свет на концепцию операции свертки 1x1, которая представлена ​​в статье «Сеть в сети» Лин и др. и Google Inception Некоторое время назад я прочитал статью «Сеть в сети» (NiN),..

    Лучшие расширения VS Code в 2022 году
    Код ВС Лучшие расширения VS Code в 2022 году Список самых полезных расширений VS Code, которые вы можете использовать как разработчик в 2022 году Расширения находятся на рынке VS Code,..