【问题标题】:Print preview dialog box print button not working打印预览对话框打印按钮不起作用
【发布时间】:2014-11-08 05:58:09
【问题描述】:

我在打印时遇到了一个小问题。当我尝试从打印预览对话框打印文档时。它没有打印任何东西。如果我隐藏预览对话框并调用pdoc.Print();,它会完美运行。预览对话框按钮是否有任何特殊事件...?

        public void print()
    {
        PrintDialog pd = new PrintDialog();
        PrintDocument pdoc = new PrintDocument();
        int w=Convert.ToInt32(Length/2.54)*100;
        int h = Convert.ToInt32(Width / 2.54) * 100;           
       // pdoc.DefaultPageSettings.Landscape = true;
        PaperSize psize = new PaperSize("Custom", w, h);
        pdoc.DefaultPageSettings.PaperSize = psize;
        pd.Document = pdoc;            
        pdoc.PrintPage += new PrintPageEventHandler(pdoc_PrintPage);
        DialogResult result = pd.ShowDialog();
        if (result == DialogResult.OK)
        {
            PrintPreviewDialog ppd = new PrintPreviewDialog();
            ppd.Document = pdoc;
            ppd.PrintPreviewControl.Zoom = 1.0;
            ((Form)ppd).WindowState = FormWindowState.Maximized;

            if (cid.Length > 1)// 
            {
                ppd.PrintPreviewControl.Zoom = 0.75;
                ppd.PrintPreviewControl.Columns = 2;
                ppd.PrintPreviewControl.Rows = 3;
            }

            DialogResult ppdResult = ppd.ShowDialog();

            //Newly Added Code
            if (ppdResult == DialogResult.OK)
            {
                MessageBox.Show("hai");//this code not executing
                 pdoc.Print();//this code not executing
            }
        }
    }

更新代码

   void pdoc_PrintPage(object sender, PrintPageEventArgs e)
    {
        if (PrintCount>pc)
        {
            Graphics g = e.Graphics;
            if(CPayAgainstX>0 && CPayAgainstY>0)
                 positionsettings(g, "payagainst", CPayAgainstX, CPayAgainstY, CPayAgainstW, CPayAgainstF);
            if (ChqDateX > 0 && ChqDateY > 0)
                 positionsettings(g, "date", ChqDateX, ChqDateY, ChqDateW, ChqDateF);
            if (ChqAmtWrdsX > 0 && ChqAmtWrdsY > 0)
                 positionsettings(g, "amountword", ChqAmtWrdsX, ChqAmtWrdsY, ChqAmtWrdsW, ChqAmtWrdsF);
            if (ChqAmtDgtX > 0 && ChqAmtDgtY > 0)
                positionsettings(g, "amount", ChqAmtDgtX, ChqAmtDgtY, ChqAmtDgtW, ChqAmtDgtF);


            if(AccountPayeeX>0 && AccountPayeeY>0)
                positionsettings(g, "AccountPayee", AccountPayeeX, AccountPayeeY, AccountPayeeW, AccountPayeeF);

            if (TextField1X > 0 && TextField1Y > 0)
                positionsettings(g, "TextField1", TextField1X, TextField1Y, TextField1W, TextField1F);
            if (TextField2X > 0 && TextField2Y > 0)
                positionsettings(g, "TextField2", TextField2X, TextField2Y, TextField2W, TextField2F);
            if (TextField3X > 0 && TextField3Y > 0)
                positionsettings(g, "TextField3", TextField3X, TextField3Y, TextField3W, TextField3F);

            appendxml_transaction(cid[pc], bankname, templatename, dt[pc], payagainst, amt[pc]);
            pc += 1;
            if (PrintCount > pc)
            {
                e.HasMorePages = true;                   
            }               
        }
    }

【问题讨论】:

  • 你给pdoc_PrintPage编码了吗?
  • @TaW 是的,我已经编码了。如果我直接调用pdoc.Print() 方法,我会得到打印。我使用预览对话框按钮时的问题

标签: c# winforms printing


【解决方案1】:

通常这样使用 Winforms 对话框:

  • 首先创建对话框,
  • 然后显示它,收集结果
  • 最终按结果办事

但是PrintPreviewDialog 并不是这样工作的,尽管许多人认为其他明智。 (我有一本通常可靠的书也弄错了..)

这里通过按下“打印”按钮/图标开始打印,任何关闭对话框的方式都会返回cancel

当您想到它时,其目的很明显:PrintPreviewDialog 为用户提供了要打印的页面或页面的选择,因此在用户完成所有操作并关闭它之前保持打开状态是有意义的。

那么为什么你的代码不起作用?

当您按下“打印”按钮时,系统会为每一页调用 PrintDocument 的 PrintPage 事件。如果什么都没发生,您要么没有对该事件进行编码,要么在那里出现了问题。如果您确实对其进行了编码,请将其代码添加到您的问题中。我知道你必须创建它,因为你已经分配了它:

pdoc.PrintPage += new PrintPageEventHandler(pdoc_PrintPage);

您可能还想为其设置断点!不过我有点惊讶,因为根据文档 pDoc.Print 命令也只是调用 PagePrint..所以我想知道行为上的任何差异可能来自哪里..

【讨论】:

  • if 块内的代码没有执行。我放了一个消息框和调试来验证。当我单击打印按钮时,它要求保存文档(我使用的是微软打印机)并保存一个带有一页的空白文档。实际上我的文档包含 5 页。
  • 如果阻止?你的旧的?如何 pdoc.Print();有时工作正常,就像你写的那样,然后,当它出现在检查之后呢?一定有其他问题!
  • 我已经用您提供的代码更新了问题。请看。
  • 忘掉我之前的回答和 cmets。我对 PrintPreviewDialog 的看法是错误的,它与其他对话框的工作方式完全不同。不过,仍然不确定您的问题!
  • 你描述了这个理论,我理解了。但没有提到我的问题的任何解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多