我在打印时遇到了一个小问题。当我尝试从打印预览对话框打印文档时,它没有打印任何内容。如果我隐藏预览对话框并调用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;
}
}
}
2条答案
按热度按时间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个简单的页面,然后你可以在绘图功能中添加更多的项目(字符串或行,如你所愿)。然后你应该能够打印出所有的页面
k2fxgqgv2#
通常Winforms对话框的用法如下:
但是
PrintPreviewDialog
并不是这样工作的,尽管许多人认为它是明智的。(我有一本通常可靠的书,也把它弄错了。)在此,通过按“打印”按钮/图标开始打印,任何关闭对话框的方法都将返回
cancel
。它的目的再明显不过了,当你想一想:
PrintPreviewDialog
为用户提供了选择打印哪一页或哪些页的功能,因此在用户完成所有操作并将其关闭之前保持打开状态是有意义的。那么,为什么您的代码不起作用呢?
当您按下“打印”按钮时,系统会为每一页呼叫PrintDocument的
PrintPage
事件。如果没有任何React,则表示您尚未编码该事件,或该事件有错误。如果您已编码,请将其代码新增到您的问题中。我知道您一定已建立它,因为您已指派它:你可能还想给它设置一个断点!不过我有点惊讶,因为根据文档,pDoc.Print命令也只是调用PagePrint...所以我想知道行为上的任何差异可能来自哪里...