【问题标题】:Launch non-modal report viewer window启动非模态报表查看器窗口
【发布时间】:2014-02-12 02:21:05
【问题描述】:

我的 Winforms 应用程序需要启动一个或多个非模态报表查看器窗口,然后主窗口开始其业务(包括打开模态对话框)。我在earlier article 中找到了以下代码(由 H. Passant 编写):

private void button1_Click(object sender, EventArgs e) {
    var t = new System.Threading.Thread(() => Application.Run(new Form2()));
    t.SetApartmentState(System.Threading.ApartmentState.STA);
    t.Start();
}

在我的例子中,“Form2”包含一个停靠的 ReportViewer 控件,设置为显示所需的报告 [new frmRptView(sReport, aRptParams)]。

在我的测试过程中一切似乎都运行良好,但是当我向测试人员提供构建时,他们报告说查看器窗口有时会锁定,摆脱它们的唯一方法是注销或重新启动。我们在使用 form.Show() 时也遇到了同样的问题。

编辑:启动非模态窗口以使其独立于主应用程序窗口的正确方法是什么?

【问题讨论】:

  • 可能没有足够的信息来诊断问题。你能提供更多细节吗?
  • 为什么不能正常打开新窗口?
  • 我一开始尝试使用 form.Show(),但这些窗口也变得没有响应。我会改写这个问题。

标签: multithreading winforms reportviewer non-modal


【解决方案1】:

如果您只需要显示一个寿命不长于主窗口的非模态窗口,只需创建一个表单实例并从您的按钮单击处理程序中显示它。这比创建多个 UI 线程简单且安全得多。

private void button1_Click(object sender, EventArgs e) 
{
   (new Form2()).Show();
}

【讨论】:

  • 这就是我在尝试线程方法之前使用的。用户不断报告查看器窗口变得无响应。我认为这可能是由于主窗口使用的模态形式,所以我尝试了 MT 方法。我从来没有能够重现这种行为。有什么想法可能导致非模态查看器窗口锁定?
  • 检查查看器窗口中是否存在泄漏资源或导致使用量激增的内容。检索数据后是否关闭所有查询报表的连接。由于报表查看器窗口变得无响应,因此需要在该控件内调查问题。
猜你喜欢
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2010-12-20
相关资源
最近更新 更多