【问题标题】:Problems opening a form from another form [duplicate]从另一个表单打开表单时出现问题[重复]
【发布时间】:2014-12-17 13:23:46
【问题描述】:

我的解决方案中有两个项目,每个项目都有一种形式。

我试图在 if 语句中打开第二个表单,但发生的情况是,当声明新表单时,代码突然中断,并在未完成声明的情况下移动到 client.close();

我通常在 asp.net 中编程,以前从未见过这样的东西,代码永远不会运行到 .ShowDialog() 并且不会因错误而中断。

  else if (DeviceRead == "DeviceRead:2")
  {
      _RequestID = RequestID.Remove(0, 10);
      _DeviceID = DeviceRead.Remove(0, 11);

      //this.Hide();

      GenericEPadDemo.frmMain sig = new GenericEPadDemo.frmMain();
      sig.ShowDialog();

  }  

 }
 s.Close();

 }
 finally
 {
    client.Close();
 }

返回的错误是:ActiveX control '30778fc6-eaba-43a7-ba39-6875a3b16057' 无法实例化,因为当前线程不在单线程单元中。

【问题讨论】:

  • 您正在抑制一个异常;可能索引或范围
  • 那一行产生了异常?有什么例外?
  • @AdrianNasui 我添加了一个 try catch 并将错误放在上面。
  • 您是否在 Windows 窗体中使用 OCX 控件?如果没有,你有病毒:P
  • @AdrianNasui 我看到了那个,但我不明白我应该在哪里创建一个新线程,它也没有解释什么是“MyThreadStartMethod”

标签: c# winforms forms


【解决方案1】:

引用:

" 继续在应用程序的主条目中添加 [STAThread],这表明 COM 线程模型是单线程单元 (STA)

示例:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new WebBrowser());
    }
}

"

在此处查看第二个答案: Single-threaded apartment - cannot instantiate ActiveX control

[稍后编辑] 尝试上面链接中的第一个答案,如下所示:

Thread t = new Thread(new ThreadStart(() =>
{
    {
        GenericEPadDemo.frmMain sig = new GenericEPadDemo.frmMain();
        sig.ShowDialog();
    };
}));
t.SetApartmentState(ApartmentState.STA);
t.Start();

【讨论】:

  • 我已经在入口点有[STAThread],但是调用第二个表单时它不起作用。
  • 在我的回答中检查我的第二个解决方案。这是链接中的第一个答案
猜你喜欢
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2013-06-22
  • 2016-04-21
  • 2015-08-12
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多