C# Windows表单打印对话框需要点击两次“确定”才能响应。

4

我正在使用Visual Studio 2008,.net Framework 3.5开发一个Windows窗体客户端-服务器应用程序。当我运行程序并尝试打印时,出现了一个奇怪的错误。打印对话框会弹出,但我必须点击两次“确定”按钮才能正常工作。第二次点击后它就可以正常工作,没有任何错误。当我在if (result == DialogResult.OK)处设置断点时,断点直到第二次点击才触发。以下是代码:

private void tbPrint_Click(object sender, EventArgs e)
{
    try
    {
        printDialog1.Document = pDoc;

        DialogResult result = printDialog1.ShowDialog();

        if (result == DialogResult.OK)
        {
            pDoc.PrinterSettings.PrinterName = printDialog1.PrinterSettings.PrinterName;
            pDoc.Print();
        }
        ...

这真让我疯了,我也看不出有什么其他的因素会干扰它。


你能否展示一下printDialog中当发送结果为DialogResult.OK时的代码? - Bruno Costa
3个回答

1
我使用计时器实现了它。
将一个计时器拖放到包含工具栏的窗体上,并将其转换为一个一次性计时器,延迟设置为1毫秒。注意:计时器必须最初设置为“禁用”。
private void toolStripBtnPrint_Click(object sender, EventArgs e)
{
   timer1.Interval = 1; // 1ms
   timer1.Enabled = true;
}

创建一个计时器滴答事件处理程序。
private void timer1_Tick(object sender, EventArgs e)
{
    timer1.Enabled = false;
    PrintDialog printDialogue=new PrintDocument();        
    //Do your initialising here
    if(DialogResult.OK == printDialogue.ShowDialog())
    {
        //Do your stuff here
    }
}

它可能很粗糙,但它帮我解决了一个问题。HTH


1

在使用C#/WinForms中的OpenFileDialog时,我遇到了“第一次工具栏单击未被识别”的问题。在经过大量咒骂和谷歌搜索之后,我做了以下操作:

  • toolstrip1_Click 函数中:

    private void toolStrip1_Click(object sender, EventArgs e)
    {
      this.Validate();
    }
    
  • 在调用 OpenFileDialog 的函数中:

    private void locateMappingToolStripMenuItem_Click(object sender, EventArgs e)
    {
      OpenFileDialog dg = new System.Windows.Forms.OpenFileDialog();
      if (dg.ShowDialog() == DialogResult.OK)
      {
        fileLocation = Path.GetDirectoryName(dg.FileName);
        try
        {
          if (LoadData())
          {
            //启用工具栏按钮
            toolStripButton3.Enabled = true;
            toolStripButton5.Enabled = true;
            toolStripButton1.Enabled = true;
            toolStripButton2.Enabled = true;
            searchParm.Enabled = true;
            toolStripButton4.Enabled = true;
            toolStripButton6.Enabled = true;
            exitToolStripMenuItem.Enabled = true;
            EditorForm.ActiveForm.TopLevelControl.Focus();
          }
        }
        catch (Exception exx) 
        {
          MessageBox.Show(exx.Message + Environment.NewLine + exx.InnerException);
        }
      }
    }
    
  • 看起来有两个关键点:

    • OpenFileDialog关闭时,需要将焦点重置到主窗口(EditorForm.ActiveForm.TopLevelControl.Focus();
    • 当工具栏按钮被点击时,工具栏会自我验证(this.Validate())并识别鼠标事件。

    0

    这似乎就是答案。当我使用普通按钮而不是工具栏按钮时,它可以在一次点击中工作! - sbartlett
    这是解决工具栏和打印对话框问题的方法:http://www.codeguru.com/forum/showthread.php?p=1746116。 - sbartlett
    理论上它可以解决问题,但你无法从打印对话框中获取DialogResult,因此它并不是一个实际可行的解决方案。 - sbartlett
    你可以将需要结果的任何内容包装到一个由委托调用的方法中。我也遇到了同样的问题,在我的情况下很容易解决:我有一个ToolStripMenuItem用于此功能,所以我只需通过委托从ToolStripButton_Click触发ToolStripMenuItem_Clicked :) - peter p

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接