winforms 打印预览对话框的打印按钮不工作

bfhwhh0e  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(223)

我在打印时遇到了一个小问题。当我尝试从打印预览对话框打印文档时,它没有打印任何内容。如果我隐藏预览对话框并调用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;                   
            }               
        }
    }
avkwfej4

avkwfej41#

我一直在努力解决这个问题。找到了我的解决办法,通过双重检查循环,同时打印多页。
// -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果我有3页要打印,我将声明我的页码,并在转到下一页时递增
整数页码= 1
1.图纸第(1)页
1.页码增加1
1.图纸第(2)页
1.页码增加1
1.图纸第(3)页
1.页码增加1
// -------------逻辑结束------------
如果你注意到我的,我的当前pageNumber是4,当我试图打印文档时,程序将开始打印darwPage(4)
因此,我要解决这个问题,就是在printPreview中绘制完所有页面后,将pageNumber和其他参数声明为初始状态
https://www.codeproject.com/Tips/733680/Printing-and-Previewing-multiple-pages-in-Csharp-2
试着打印同样的东西,就像在上面提供的网页中所做的一样。确保你能够打印这3个简单的页面,然后你可以在绘图功能中添加更多的项目(字符串或行,如你所愿)。然后你应该能够打印出所有的页面

k2fxgqgv

k2fxgqgv2#

通常Winforms对话框的用法如下:

  • 首先创建对话框,
  • 然后显示,收集结果
  • 最后根据结果采取行动

但是PrintPreviewDialog并不是这样工作的,尽管许多人认为它是明智的。(我有一本通常可靠的书,也把它弄错了。)
在此,通过按“打印”按钮/图标开始打印,任何关闭对话框的方法都将返回cancel
它的目的再明显不过了,当你想一想:PrintPreviewDialog为用户提供了选择打印哪一页或哪些页的功能,因此在用户完成所有操作并将其关闭之前保持打开状态是有意义的。
那么,为什么您的代码不起作用呢?
当您按下“打印”按钮时,系统会为每一页呼叫PrintDocument的PrintPage事件。如果没有任何React,则表示您尚未编码该事件,或该事件有错误。如果您已编码,请将其代码新增到您的问题中。我知道您一定已建立它,因为您已指派它:

pdoc.PrintPage += new PrintPageEventHandler(pdoc_PrintPage);

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

相关问题