【问题标题】:C# print preview gets closed when you close another form当您关闭另一个表单时,C# 打印预览会关闭
【发布时间】:2012-11-19 12:10:09
【问题描述】:

我正在显示一些大页面的打印预览窗口。这些渲染需要一些时间,所以我想显示比默认的“第 1/1 页”消息更多的进度信息。

我创建了一个简单的 windows 窗体项目来展示我当前的方法:

(您可以创建一个包含两个表单的新 windows 表单项目,如果您愿意,可以复制粘贴)

public event EventHandler PrintReady;
public event ProgressChangedEventHandler ProgressChanged;

private void button1_Click(object sender, EventArgs e)
{
  var printDocument = new PrintDocument();
  printDocument.PrintPage += new PrintPageEventHandler(printDocument_PrintPage);
  printDocument.EndPrint += new PrintEventHandler(printDocument_EndPrint);

  var printPreviewDialog = new PrintPreviewDialog();
  printPreviewDialog.Document = printDocument;

  // Create the 'progress' form.
  var form2 = new Form2(this);
  form2.Show();

  printPreviewDialog.ShowDialog();            
}

void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
  for (int i = 0; i < 100; i++)
  {
    // This is where I do some rendering.
    Thread.Sleep(20);
    if (this.ProgressChanged != null)
    {
      this.ProgressChanged.Invoke(this, new ProgressChangedEventArgs(i, null));
    }
  }            
}

void printDocument_EndPrint(object sender, PrintEventArgs e)
{
  if (this.PrintReady != null)
  {
    this.PrintReady.Invoke(this, null);
  }
}

然后我的进度表:

public Form2(Form1 form1)
{
  form1.ProgressChanged += new ProgressChangedEventHandler(ProgressChangedHandler);
  form1.PrintReady += new EventHandler(PrintReadyHandler);
  InitializeComponent();
}

void PrintReadyHandler(object sender, EventArgs e)
{
  this.Close();
}

void ProgressChangedHandler(object sender, ProgressChangedEventArgs e)
{
  progressBar1.Value = e.ProgressPercentage;
}

'this.Close()' 也关闭了我的打印预览!如果我删除该行,则仅显示打印预览并保持打开状态。所以 Close() 函数同时关闭了进度窗口和 PrintPreview 窗口。

为什么会这样?

【问题讨论】:

  • 所以隐藏表单?打印预览窗口正在关闭,因为您关闭了启动打印预览的表单。另一种解决方案是从自己的线程启动预览。
  • @Ramhound:我没有关闭启动打印预览的表单。我只关闭Form2。两者之间唯一的参考是一个事件......

标签: c# winforms printing progress


【解决方案1】:

我认为您需要将“打印预览”对话框的所有者指定为 form1 - 见下文:

printPreviewDialog.ShowDialog(this);

【讨论】:

  • 谢谢!这解决了问题。所以它必须默认使用最后创建的窗口作为它的所有者?我必须承认我无法完全理解这种行为。
猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 2013-04-11
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多