修复在C#中使用HasMorePages打印时的分页问题。
关于这段代码的解释:您可以添加许多行或从数据库中读取以查看打印期间的分页结果,例如,我手动添加了两行到表中,这是没有分页的,因为行数很少。手动添加许多行或将信息从数据库插入到网格视图中。这是一个示例:
int currentPage = 1;
int rowsPerPage = 36;
int rowIndex = 0;
void pdoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
try
{
int x = 5, y = 5;
int rowMargin = 0;
dgvHesaab.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dgvHesaab.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dgvHesaab.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dgvHesaab.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
dgvHesaab.ColumnHeadersHeight = 40;
dgvHesaab.RightToLeft = RightToLeft.Yes;
int rowCount = dgvHesaab.Rows.Count;
int pageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(rowCount) / Convert.ToDouble(rowsPerPage)));
for (int j = this.dgvHesaab.Columns.Count - 1; j >= 0; j--)
{
Rectangle rect = new Rectangle(x, y, 132, dgvHesaab.Rows[0].Height);
StringFormat sf = new StringFormat();
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;
e.Graphics.FillRectangle(Brushes.LightGray, rect);
e.Graphics.DrawRectangle(Pens.Black, rect);
if (this.dgvHesaab.Columns[j].HeaderText != null)
{
e.Graphics.DrawString(this.dgvHesaab.Columns[j].HeaderText, SystemFonts.DefaultFont, Brushes.Black, rect, sf);
}
x += rect.Width;
}
x = 5;
y += dgvHesaab.Rows[0].Height + rowMargin;
while (rowIndex < dgvHesaab.Rows.Count)
{
DataGridViewRow row = dgvHesaab.Rows[rowIndex];
if (row.Cells[0].Value != null)
{
for (int j = this.dgvHesaab.Columns.Count - 1; j >= 0; j--)
{
DataGridViewCell cell = row.Cells[j];
Rectangle rect = new Rectangle(x, y, 132, dgvHesaab.Rows[0].Height);
StringFormat sf = new StringFormat();
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;
e.Graphics.DrawRectangle(Pens.Black, rect);
if (cell.Value != null)
{
e.Graphics.DrawString(cell.Value.ToString(), new Font("Tahoma", 8, FontStyle.Bold), Brushes.Black, rect, sf);
}
x += rect.Width;
}
x = 5;
y += dgvHesaab.Rows[0].Height + rowMargin;
}
rowIndex++;
if (rowIndex % rowsPerPage == 0 || rowIndex == dgvHesaab.Rows.Count)
{
e.HasMorePages = (currentPage < pageCount);
currentPage++;
return;
}
}
}
catch (Exception)
{
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
try
{
dgvHesaab.Rows.Add(new object[]
{
"Row 1 : Item 1",
"Row 1 : Item 2",
"Row 1 : Item 3",
"Row 1 : Item 4",
"Row 1 : Item 5",
"Row 1 : Item 6",
});
dgvHesaab.Rows.Add(new object[]
{
"Row 2 : Item 1",
"Row 2 : Item 2",
"Row 2 : Item 3",
"Row 2 : Item 4",
"Row 2 : Item 5",
"Row 2 : Item 6",
});
dgvHesaab.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dgvHesaab.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dgvHesaab.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dgvHesaab.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
dgvHesaab.ColumnHeadersHeight = 40;
dgvHesaab.RightToLeft = RightToLeft.Yes;
PrintDialog pDialog = new PrintDialog();
pDialog.AllowCurrentPage = false;
pDialog.AllowPrintToFile = false;
pDialog.AllowSelection = false;
pDialog.AllowSomePages = false;
pDialog.PrintToFile = false;
pDialog.ShowHelp = false;
pDialog.ShowNetwork = false;
if (pDialog.ShowDialog() == DialogResult.OK)
{
System.Drawing.Printing.PrintDocument pdoc = new System.Drawing.Printing.PrintDocument();
pdoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(pdoc_PrintPage);
pdoc.DocumentName = "Print Title";
pdoc.PrinterSettings = pDialog.PrinterSettings;
pdoc.DefaultPageSettings = pDialog.PrinterSettings.DefaultPageSettings;
pdoc.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(100, 100, 100, 100);
pdoc.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);
pdoc.DefaultPageSettings.Landscape = false;
PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog();
printPreviewDialog1.Document = pdoc;
pdoc.Print();
}
}
catch (Exception)
{
}
}
StandardPrintController
,它可以正常工作,但是使用PreviewPrintController
就不行。因此,这个答案并没有帮助到我。 - huMpty duMpty