【问题标题】:Is there a better way to check if a form is loaded?有没有更好的方法来检查表单是否已加载?
【发布时间】:2012-10-25 22:43:42
【问题描述】:

我的应用中有 2 个表单,Form1Form2。我想知道是否有 检查表单是否已加载的更好方法。如果表格是 加载到内存中并且可见,我希望按钮什么也不做,如果User 已经关闭了它应该重新实例化它的表单。

欲了解更多信息,请查看我的代码或评论.. :)

public partial class Form1: Form
{
    private Form2 form2;

    public Form1() {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {

        if (form2== null) {
            form2= new Form2();
        } else {
            if (form2.has_exited()) { // this is a private property
                                      // that I set when Form2.Closing executes
                form2.Dispose();
                form2= new Form2();
            }
        }
        form2.Show();
    }
}

【问题讨论】:

  • 你可以让表单的实例一直处于活动状态,永远不要调用它的 Close 方法,而是隐藏它,然后使用 Form2.Visible (true -> shown, false -> hidden)
  • 所有解决方案看起来都不错,但我不确定该选择哪一个。我会选择正确的答案作为最多票

标签: c# winforms


【解决方案1】:

您不需要让Form2 处理关闭事件,您可以直接从Form1 处理:

private Form2 form2;

private void button1_Click(object sender, EventArgs e)
{
    if (form2 == null)
    {
        form2 = new Form2();
        form2.FormClosed += (_, arg) =>
        {
            form2 = null;
        };
        form2.Show();
    }
    else
    {
        //the other form has been opened and not closed; not sure what you want to do
    }
}

另请注意,如果通过Show 显示表单,则无需丢弃它。如果您通过ShowDialog 显示它,那么您会这样做,但是当您使用非模态对话框时,系统会自动将事件处理程序附加到调用 dispose 的关闭事件。

【讨论】:

  • 谢谢,效果很好,我喜欢我不必在其他表单上添加参数。非常感谢。
【解决方案2】:

我会用

if (form2 == null)
{
    form2 = new Form2();
    form2.FormClosed += (s, e) => { this.form2 = null; };
    form2.Show();
}
form2.BringToFront()

所以每次form2 关闭时,引用都会设置为null。下次可以重新实例化。

只要它还在,就把它带到前面。

【讨论】:

    【解决方案3】:

    您可以将 Form1 传递给 Form2,并且在 .Loaded 等事件中或在 Form2 中处理/退出时,您可以使用 Form1 对象让它知道这些事件已经发生。

    【讨论】:

      【解决方案4】:

      如果您正在显示表单,表单将引发名为 Form.Shown 的事件

      http://msdn.microsoft.com/en-us/library/system.windows.forms.form.shown.aspx

      您可以在那里放置某种处理代码(即使它只是设置一个标志)。同样,如果用户关闭它,则会有一个表单关闭/关闭事件。

      我认为还有一个表单加载事件,但我不记得了。

      【讨论】:

        猜你喜欢
        • 2016-10-28
        • 1970-01-01
        • 2022-09-22
        • 1970-01-01
        • 2014-10-23
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多