【问题标题】:Execute 'Form_Shown' event handler more than once?多次执行“Form_Shown”事件处理程序?
【发布时间】:2011-12-12 01:45:24
【问题描述】:

我目前正在开发具有多种形式的 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();
    }
    

【问题讨论】:

  • 你真的试过了吗?显示的事件将为表单的每个新实例执行。如果您要显示/隐藏 1 个实例,则需要另一个事件。
  • 我试过了,它实际上只在第一次工作,你的答案没有帮助,因为我在我的程序中显示/隐藏,我只加载一次......

标签: c# winforms events event-handling


【解决方案1】:

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

【讨论】:

  • 那会有同样的问题。
【解决方案2】:

你想要什么需要一些关于在 WinForm 生命周期中发生的事件的详细知识。这可能记录在某处,我不知道。

这就是我会发现的方式:

  1. 用 2 个表单(主要和辅助)创建一个小型测试项目
  2. 添加显示和隐藏按钮并确保其正常工作。
  3. Debug.Print("EventName")添加到助手表单的所有候选事件中。
  4. 查看输出窗口中的日志并选择您的事件。

候选事件将是 FormClosing、FormClosed、(De)Activated、Enter、Leave、Load,...遍历列表。

当您找到正确的答案时,请在此处发布。

【讨论】:

  • 好吧,我不想经历这一切,但我认为这是确定所做工作的唯一方法。感谢您的帮助 +1
  • 关于“什么时候发生什么事件”,请参阅Order of Events in Windows Forms
【解决方案3】:

它的行为是设计的。

来自文档: 每当表单首先显示时,就会发生 Shown 事件。

此外,您不应在类中处理 Shown 事件,而应覆盖 OnShown。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2012-03-30
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多