【问题标题】:Check if form is opened and update if opened检查表单是否打开,如果打开则更新
【发布时间】:2013-10-03 21:18:38
【问题描述】:

我想检查一个表单的实例是否被打开并打开现有的实例来更新一个文本框,否则创建一个新的实例。

搜索后发现:How to check if a windows form is already open, and close it if it is?

从我尝试过的接受的答案

try
{
    foreach (Form fm in Application.OpenForms)
    {
        if (fm is Form2)
        {
            Form2 n1 = (Form2)Application.OpenForms["Form2"];
            n1.textBox1.Text = textBox1.Text;
            break;
        }
        else
        {
            Form2 n1 = new Form2();
            n1.textBox1.Text = textBox1.Text;
            n1.Show();
        }
    }
}
catch (InvalidOperationException)
{
}

除了这个代码会抛出一个InvalidOperationException(我已经注意到了),代码不起作用,因为如果一个实例已经存在,它仍然会创建一个新实例。

我做错了什么?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    更好的方法是根据表单类型过滤 OpenForms:

    var form2collection = Application.OpenForms.OfType<Form2>();

    然后您可以遍历这些,或者如果集合为空,则打开一个新表单。优点是你不依赖表单名,而是表单的实际类定义,更可靠。

    此外,我倾向于避免直接操作来自其他代码的控件。别人调用方法我觉得更靠谱,比如

    public void setSomeControl(string value)
    {
        this.controlName.Text = value;
    }
    

    然后调用

    form2collection[0].setSomeControl("new value");

    它允许你的表单做所有的家务,调用代码可以忽略这些细节。

    【讨论】:

    • 谢谢。你的回答让我知道我需要做什么。我应该编辑你的答案并添加我使用的代码吗?
    • 最好编辑 question 以显示您的最终结果。编辑答案可能会被模组拒绝为“无效的编辑 - 尝试回复”。但我相信人们会很高兴看到你的最终解决方案!
    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2020-12-20
    相关资源
    最近更新 更多