【问题标题】:Opening New Form From Event Handler in Main Form Hangs App从主窗体中的事件处理程序打开新窗体挂起应用程序
【发布时间】:2009-02-25 15:54:28
【问题描述】:

我正在尝试从 C# 程序的主窗体中的事件处理程序中打开一个新窗体。事件处理程序被正确调用并打开新表单,但新表单被冻结,甚至最初都没有填充。

我可以在主窗体上创建一个按钮并在单击该按钮后创建新窗体,但是从事件处理程序完成后它无法正常工作。

事件处理程序不需要知道在它创建的表单上所做的任何事情的结果 - 它只需要创建它并避开。

我需要做什么?新表单需要独立于主表单运行。

这里是我定义事件处理程序的地方:

ibclient.RealTimeBar += new EventHandler<RealTimeBarEventArgs>(ibclient_RealTimeBar);

这是事件处理程序代码:

void ibclient_RealTimeBar(object sender, RealTimeBarEventArgs e)
{
    FancyForm a_fancy_form = new FancyForm();
    a_fancy_form.Show();
}

通过单击按钮创建新表单效果很好:

private void button7_Click(object sender, EventArgs e)
{
    FancyForm a_fancy_form = new FancyForm();
    a_fancy_form.Show();
}

【问题讨论】:

  • 请在您正在创建和显示新表单的位置添加您的代码。

标签: c# winforms


【解决方案1】:

您可以发布事件处理程序代码吗?.. 事件是在单独的线程中引发的,然后是主 ui 吗?

编辑:
不确定实时栏的作用,但请尝试检查表单上的 invokerequired 以便您可以在与主 UI 相同的线程上创建辅助表单..

void ibclient_RealTimeBar(object sender, RealTimeBarEventArgs e)
{
    if(this.InvokeRequired)
    {
        this.Invoke(((Action)() => ShowFancyForm()));
    }

    ShowFancyForm();
}

FancyForm a_fancy_form;
private void ShowFancyForm()
{
    if(null != a_fancy_form)return;

    a_fancy_form = new FancyForm();
    a_fancy_form.Show();
}

当然,这使用了一些肮脏的快捷方式并假设为 3.5,但您可以根据需要进行修改。

我还把 FancyForm 声明移到了方法的范围之外。再次根据您的需要进行调整。

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题,我使用了 Quintin 的代码,现在可以正常工作了......

    为了使用框架 2.0,我做了一些更改,这就是我所做的: 首先,我创建了一个委托,指向打开表单的方法:

    public delegate void pantallazo();
    pantallazo obj=new pantallazo(this.ShowFancyForm);
    

    打开表单的方法和 Quintin 提供的一样:

    smatiCliente a_fancy_form;   //smatiCliente  is the name of my new form class...
        private void ShowFancyForm()
        {
            if (null != a_fancy_form) return;
            a_fancy_form = new smatiCliente();
            this.Hide();
            a_fancy_form.Show();
        }
    

    在我的程序的事件处理程序中,y 做了一些简单的更改:

     if(this.InvokeRequired)
                        {
                            this.Invoke(obj);
                        }
                        ShowFancyForm();
    

    就是这样,它现在很好用。 Invoke 方法执行适当的委托,因此现在在主 UI 下创建了表单。

    希望它有效,非常感谢 Quintin!

    【讨论】:

      【解决方案3】:

      您知道事件处理程序中正在运行哪个线程吗?我相信它可能必须是主要的 GUI 线程才能工作。

      【讨论】:

      • 没有力量。它必须是。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多