Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查表单是否已加载_C#_.net_Winforms - Fatal编程技术网

C# 检查表单是否已加载

C# 检查表单是否已加载,c#,.net,winforms,C#,.net,Winforms,我有两张表格 其中一个是主窗体(我们称之为主窗体) 另一个用于显示一些警告(我们称之为dialogForm) 。dialogForm中有一个标签。单击MainForm中的按钮时,dialogForm打开。 但dialogForm中的标签为空。实际上它没有时间加载。我想检查dialogForm是否已完全加载,然后进程可以在MainForm中继续。 例如: dialogForm tempFrm = new dialogForm(); tempFrm.Show(); // I want to wa

我有两张表格

  • 其中一个是主窗体(我们称之为主窗体)
  • 另一个用于显示一些警告(我们称之为dialogForm)
。dialogForm中有一个标签。单击MainForm中的按钮时,dialogForm打开。 但dialogForm中的标签为空。实际上它没有时间加载。我想检查dialogForm是否已完全加载,然后进程可以在MainForm中继续。 例如:

dialogForm tempFrm = new dialogForm();
tempFrm.Show(); // I want to wait till the dialogForm is fully loaded. Then continue to "while" loop.
while(..)
{
...
}

因此,您需要使用显示的表单
事件:

tempFrm.Shown += (s, e) =>
{
    while(..)
    {
    }
}

但你会有另一个问题。它会堵住线的。您需要在另一个线程上运行此
循环,方法是利用
BackgroundWorker
线程

为什么不创建一个布尔值以及访问它的方法

private bool Ready = false;

public ConstructorMethod()
{
    // Constructor code etc.
    Ready = true;
}

public bool isReady()
{
    return Ready;
}

你可以试试下面的方法

private bool Is_Form_Loaded_Already(string FormName)
            {
                foreach (Form form_loaded in Application.OpenForms)
                {
                    if (form_loaded.Text.IndexOf(FormName) >= 0)
                    {
                        return true;
                    }
                }
                return false;
            }
你也可以看看这个

您的while(…)会阻止UI线程,因此子窗体将永远不会收到消息,也不会被加载

为了实现目标,您应该订阅Load事件并在处理程序中继续您的代码

void Click()
{
    var tempFrm = new dialogForm();
    tempFrm.Load += frmLoad;
    tempFrm.Show();
}

void frmLoad(object s, EventArgs ea)
{
   // form loaded continue your code here!
}

调用tempFrm.Update()。在UI代码中使用长时间循环从根本上说是错误的。不要这样做。你想要的目标是什么?@Hans你的tempFrm.Update()建议解决了这个问题。顺便说一下,原始代码中没有while循环。这只是一个例子:)谢谢你的回答。如果你发布假代码,你就不会得到好的答案:(@HansPassant如果你发布你的“tempFrm.Update()”解决方案作为答案,我可以接受。这个问题几乎有1000个视图。人们可能会在这里错过你的答案。