C#Windows窗体打印对话框单击“确定”两次以响应

C#Windows窗体打印对话框单击“确定”两次以响应,c#,printing,printdialog,C#,Printing,Printdialog,我正在使用Visual Studio 2008、.net Framework 3.5作为我正在开发的Windows窗体客户端服务器应用程序。当我运行程序并尝试打印时,出现了一个奇怪的错误。“打印”对话框打开,但我必须单击“确定”按钮两次,它才能工作。第二次单击后,工作正常,没有错误。当我在:if(result==DialogResult.OK)上放置断点时,断点直到第二次单击才触发。代码如下: private void tbPrint_Click(object sender, EventArgs

我正在使用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();
        }
        ...

这让我抓狂,我看不到任何其他会干扰它的东西。

也许这是一个类似于此的问题:

我在使用C#/WinForms中的
OpenFileDialog
时遇到了这个问题。经过多次咒骂和谷歌搜索,我做到了:

  • 在工具条1中单击:

    private void toolStrip1\u单击(对象发送方,事件参数e)
    {
    这个。Validate();
    }
    
  • 在使用调用OpenFileDialog的函数中:

    private void locateMappingToolStripMenuItem\u单击(对象发送方,事件参数e)
    {
    OpenFileDialog dg=new System.Windows.Forms.OpenFileDialog();
    如果(dg.ShowDialog()==DialogResult.OK)
    {
    fileLocation=Path.GetDirectoryName(dg.FileName);
    尝试
    {
    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();
    }
    }
    捕获(异常exx)
    {
    MessageBox.Show(exx.Message+Environment.NewLine+exx.InnerException);
    }
    }
    }
    
  • 两件事似乎是关键:

    • OpenFileDialog
      关闭时,需要将焦点重置到主窗口(
      EditorForm.ActiveForm.TopLevelControl.focus();
    • 单击toolstrip按钮时,toolstrip将验证自身(
      this.Validate()
      )并识别鼠标事件

      • 我是用定时器实现的

        在包含toolstrip的窗体上放置一个计时器,并将其转换为一次触发计时器,延迟为1mS。注意:计时器最初必须将“Enabled”设置为“False”

        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

        当打印对话框应将结果作为DialogResult发送时,您能否向我们显示打印对话框中的代码。好吗?似乎就是这样。当我使用常规按钮而不是toolstrip按钮时,它只需单击一下即可工作!以下是toolstrip和printdialog问题的修复方法:。它在理论上修复了问题,但您无法从printdialog返回DialogResult,因此它不是一个实际的修复方法。您可以将任何需要的结果包装到委托调用的方法中。就我而言,同样的问题很简单:我有一个ToolStripMenuItem用于此功能,所以我只是通过ToolStripButton的委托触发了ToolStripMenuItem(单击:)