不止一次执行'Form_Shown'事件处理程序?

时间:2011-10-20 19:28:30

标签: c# winforms events event-handling

我目前正在开发一个包含多种表单的Windows应用程序。我在其中一个表单中使用Form_Shown来执行一些代码以在显示之前初始化(刷新)表单。

在MSDN上的Form.Shown Event中,它指出仅在第一次显示表单时才会引发事件。但是,我希望能够执行代码来初始化我的表单每次我在某些表单中调用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 个答案:

答案 0 :(得分:2)

您想要的内容需要一些有关WinForm生命周期中发生的事件的详细信息。这可能是某处记载的,我不知道。

我就是这样知道的:

  1. 使用2个表单(Main和helper)创建一个小型测试项目
  2. 添加show和hide按钮并确保它有效。
  3. Debug.Print("EventName")添加到帮助表单的所有候选事件中。
  4. 查看输出窗口中的日志并选择您的活动。
  5. 候选事件将是FormClosing,FormClosed,(De)Activated,Enter,Leave,Load,...查看列表。

    如果找到合适的答案,请在答案中张贴。

答案 1 :(得分:2)

它是按设计行事。

来自文档:     只要表单显示第一个,就会发生显示事件。

另外,你不应该在你的类中处理Shown事件,而应该覆盖OnShown。

要实现您想要的功能,您可以尝试重写OnVisibleChanged方法。在方法内部,如果表单可见,则执行代码。

与Shown事件类似,您不应在表单类中处理它,而是覆盖适当的方法:

来自文档: OnVisibleChanged方法还允许派生类在不附加委托的情况下处理事件。这是在派生类中处理事件的首选技术。

答案 2 :(得分:0)

我认为您需要将代码放在form_load中