我想打印数据网格中的数据。代码可以很好地处理第一页,但是注释行不能很好地工作,并且不会移动到下一页。有人能帮我解决这个问题吗?
private void DrawFactorA4(object sender, PrintPageEventArgs ev)
{
for (int j = 0; j < GrdRDocument.Rows.Count; j++)
{
i += 2;
//draw data grid
s++;
if(s == 10)
{
//ev.HasMorePages = true; //this line doesn't work
s = 0;
i = 0;
}
else
{
ev.HasMorePages = false;
}
}
}_
private void BtnPrint_Click(object sender, EventArgs e)
{
printFont = new Font("Arial", 12);
IEnumerable<PaperSize> paperSizes =
pd.PrinterSettings.PaperSizes.Cast<PaperSize>();
sizeA4 = paperSizes.First<PaperSize>(size => size.Kind == PaperKind.A4);
pd.DefaultPageSettings.Landscape = true;
pd.DefaultPageSettings.PaperSize = sizeA4;
pd.PrintPage += new PrintPageEventHandler(this.DrawFactorA4);
printPreviewDialog.Document = pd;
printPreviewDialog.ShowDialog();
}发布于 2014-04-09 01:09:06
停下来读一读你所拥有的:
printFont = new Font("Arial", 12);字体是非托管资源;在这里,您正在创建一个字体,并且永远不会将其丢弃。也许在这种特殊情况下这是无害的,但这是一个很难养成的坏习惯。
pd.PrintPage += new PrintPageEventHandler(this.DrawFactorA4);文档中的每一页都将调用DrawFactorA4。DrawFactorA4内幕
for (int j = 0; j < GrdRDocument.Rows.Count; j++)您可以遍历GrdRDocument中的每个Row,而不管行数或页面大小。这是错误的;您必须在页面填满后停止。顺便说一句,我希望GrdRDocument是不可变数据的本地副本,并且您不会将UI控件传递给打印线程。
s++;
if(s == 10)
{
//ev.HasMorePages = true; //this line doesn't work
s = 0;您的注释行将工作得很好。问题是你设置了ev.HasMorePages = true然后忽略了它;你设置了s = 0并继续迭代;下一次迭代s!=10,所以你:
ev.HasMorePages = false;请阅读PrintDocument文档;其中有一个打印多页的示例。您应该创建一个类来存储所有非托管资源和页状态。将其设为IDisposable,这样它们就会被处理掉。仅迭代要在每页上打印的行或任何内容。类似于:
class PrintStuff : IDisposable
{
readonly IEnumerable<Whatever> data;
readonly PrintDocument pd;
Font font;
private int currentIndex;
public PrintStuff(IEnumerable<Whatever> data)
{
this.data = data;
pd = new PrintDocument();
pd.BeginPrint += OnBeginPrint;
pd.PrintPage += OnPrintPage;
pd.EndPrint += OnEndPrint;
}
public void Print()
{
pd.Print();
}
public void Dispose()
{
pd.Dispose();
}
private void OnBeginPrint(object sender, PrintEventArgs args)
{
font = new Font(FontFamily.GenericSansSerif, 12F);
currentIndex = 0;
}
private void OnEndPrint(object sender, PrintEventArgs args)
{
font.Dispose();
}
private void OnPrintPage(object sender, PrintPageEventArgs args)
{
var x = Convert.ToSingle(args.MarginBounds.Left);
var y = Convert.ToSingle(args.MarginBounds.Top);
var lineHeight = font.GetHeight(args.Graphics);
while ((currentIndex < data.Count())
&& (y <= args.MarginBounds.Bottom))
{
args.Graphics.DrawWhatever(data.ElementAt(currentIndex), font, Brushes.Black, x, y);
y += lineHeight;
currentIndex++;
}
args.HasMorePages = currentIndex < data.Count();
}
}https://stackoverflow.com/questions/22939393
复制相似问题