Выполнить обработчик события «Form_Shown» более одного раза? - PullRequest
0 голосов
/ 20 октября 2011

В настоящее время я разрабатываю приложение для Windows с несколькими формами. Я использую Form_Shown в одной из этих форм, чтобы выполнить некоторый код для инициализации (обновления) формы перед ее отображением.

В Событие Form.Shown на MSDN указывает, что событие возникает только в первый раз , когда отображается форма. Однако я хочу иметь возможность выполнять код для инициализации моей формы каждый раз, когда я вызываю Form.Show() в некоторых формах. Вот пример.

  1. Из формы с именем Game. Содержит обработчик события Game_Shown и кнопку, при нажатии которой отображается форма с именем Menu:

    private void btnMenu_Click(object sender, EventArgs e)
    {
        this.Hide();
        Formulaires.formMenu.Show();
    }
    
    private void Game_Shown(object sender, EventArgs e)
    {
        Code here...
        this.Refresh();
    }
    
  2. Из формы с именем Menu. Содержит кнопку, которая при нажатии отображает форму с именем Game:

    private void lblGame_Click(object sender, EventArgs e)
    {
        this.Hide();
        Formulaires.formGame.Show();
    }
    

Ответы [ 3 ]

2 голосов
/ 21 октября 2011

То, что вы хотите, требует некоторых подробных знаний о том, какое событие происходит в жизненном цикле WinForm. Это может быть где-то задокументировано, я не знаю.

Вот как бы я узнал:

  1. создать небольшой тестовый проект с 2 формами (Main и helper)
  2. добавьте кнопки показа и скрытия и убедитесь, что они работают.
  3. Добавьте Debug.Print("EventName") ко всем возможным событиям вспомогательной формы.
  4. Посмотрите журнал в окне вывода и выберите свое событие.

Событиями-кандидатами будут FormClosing, FormClosed, (De) Activated, Enter, Leave, Load, ... пройти список

Если вы найдете правильный ответ, пожалуйста, опубликуйте его здесь в ответ.

2 голосов
/ 21 октября 2011

Это ведет себя по проекту.

Из документов: Событие Shown наступает всякий раз, когда форма first показывается.

Кроме того, вы не должны обрабатывать событие Shown в своем классе, скорее вы должны переопределить OnShown.

Чтобы достичь того, чего вы хотите, вы можете попробовать переопределить метод OnVisibleChanged.Внутри метода, если форма видима, выполните ваш код.

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

Издокументы: метод OnVisibleChanged также позволяет производным классам обрабатывать событие, не подключая делегат.Это предпочтительный метод для обработки события в производном классе.

0 голосов
/ 20 октября 2011

Я думаю, вам нужно вместо этого поместить код в form_load

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...