在线--打印分页不成功(Windows)

520zyb 2005-09-21 02:15:46
我设置了HasMorePages = true 却不能实现分页,还是打印在了一个页面内了,代码如下:

foreach(DataRow dr in ds.Tables[0].Rows)
{
g.DrawString(dr[0].ToString(),font2,brush,pX,pY,new StringFormat());
pX += 200;
g.DrawString(dr[1].ToString(),font2,brush,pX + 70 - (int)g.MeasureString(dr[1].ToString(),font2).Width,pY,new StringFormat());
pX = leftMargin;
pY += (int)g.MeasureString(dr[0].ToString(),font2).Height + 2;

if(pY + (int)g.MeasureString(dr[0].ToString(),font2).Height > bottomMargin)
{
e.HasMorePages = true;
pY = topMargin;
}
else
{
e.HasMorePages = false;
}
}
...全文
157 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinasdp 2005-09-26
  • 打赏
  • 举报
回复
需要有外部变量标识打印的进度,我以前做过一个,把Grid显示的内容分页打印,并且用户调整后的各列宽度进行打印,代码如下:
#region 全局变量
private int curPage = 1;
private int totalPage = 1;
private int linesPerPage = 30;
private int lineHeight = 8;
private int pageWidth = 210;
private int pageHeight = 297;
private int topMargin = 15;
private int leftMargin = 15;
private int rightMargin = 15;
private int bottomMargin = 15;
private ArrayList alWidths = new ArrayList();
private ArrayList alIndexs = new ArrayList();
#endregion

// 取数据
private void simpleButton1_Click(object sender, System.EventArgs e)
{
// 取数据
gridControl1.DataSource = null;
gridView1.Columns.Clear();
try
{
OleDbDataAdapter ada = new OleDbDataAdapter(textEdit1.Text, "Provider = SQLOLEDB.1; Persist Security Info=False;User ID=sa;Initial Catalog=TCMS;Data Source=ZR11;Packet Size=4096;Workstation ID=ZR11");
DataTable tmp = new DataTable();
ada.Fill(tmp);
gridControl1.DataSource = tmp;
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

// 打印设置
private void simpleButton2_Click(object sender, System.EventArgs e)
{
// 打印设置
PageSetupDialog1.ShowDialog();
}

// 打印预览
private void simpleButton3_Click(object sender, System.EventArgs e)
{
#region 纸张设置
pageWidth = (int)Math.Round(printDocument1.PrinterSettings.DefaultPageSettings.PaperSize.Width * 0.254f);
pageHeight = (int)Math.Round(printDocument1.PrinterSettings.DefaultPageSettings.PaperSize.Height * 0.254f);
if(printDocument1.PrinterSettings.DefaultPageSettings.Landscape)
{
pageWidth += pageHeight;
pageHeight = pageWidth - pageHeight;
pageWidth = pageWidth - pageHeight;
}
#endregion

// 当前页设置
curPage = 1;

#region 页面列宽设置
int i = 0;
int width = 0;
alWidths.Clear();
alIndexs.Clear();
ArrayList visibleIndexs = new ArrayList();
for(i = 0 ; i < gridView1.Columns.Count ; i ++)
{
if(gridView1.Columns[i].VisibleIndex < 0)
{
continue;
}
width += gridView1.Columns[i].Width;
alWidths.Add(gridView1.Columns[i].Width);
visibleIndexs.Add(gridView1.Columns[i].VisibleIndex);
alIndexs.Add(i);
}
if(width == 0)
{
MessageBox.Show("没有可打印的列");
return;
}
for(i = 0 ; i < alWidths.Count ; i ++)
{
alWidths[i] = (float)(int)alWidths[i] / (float)(int)width * (float)(pageWidth - leftMargin - rightMargin);
}
#endregion

#region 根据VisibleIndex调整列的顺序
for(i = 0 ; i < alWidths.Count - 1 ; i ++)
{
int j = 0;
for(j = i ; j < alWidths.Count ; j ++)
{
if((int)visibleIndexs[j] == i)
{
break;
}
}
int tmpVIndex = (int)visibleIndexs[i];
visibleIndexs[i] = (int)visibleIndexs[j];
visibleIndexs[j] = tmpVIndex;
float tmpWidth = (float)alWidths[i];
alWidths[i] = (float)alWidths[j];
alWidths[j] = tmpWidth;
int tmpIndex = (int)alIndexs[i];
alIndexs[i] = (int)alIndexs[j];
alIndexs[j] = tmpIndex;
}
#endregion

// 每页可打印的行数
linesPerPage = (pageHeight - topMargin - bottomMargin) / lineHeight - 1;

// 总页数
totalPage = (((DataTable)gridControl1.DataSource).Rows.Count + linesPerPage - 1) / linesPerPage;

// 打印预览
printPreviewDialog1.ShowDialog();
}

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
if(totalPage < curPage)
{
return;
}
// 执行打印操作
e.HasMorePages = DrawGrid(e.Graphics);
}
private bool DrawGrid(Graphics g)
{
// 设置度量单位
g.PageUnit = GraphicsUnit.Millimeter;

#region 局部变量
int i = 0;
int j = 0;
Pen pen = new Pen(Color.Black, 0.1f);
SolidBrush sb = new SolidBrush(Color.Black);
Font font = new Font(gridControl1.Font.Name, gridControl1.Font.Size);
Font Boldfont = new Font(font.Name, font.Size, FontStyle.Bold);
float left = leftMargin;
float top = topMargin;
// 横向偏移量
float dx = 1;
// 纵向偏移量
float dy = 1;
#endregion

#region 打印标题
for(i = 0 ; i < alWidths.Count ; i ++)
{
g.DrawString(gridView1.Columns[(int)alIndexs[i]].Caption, Boldfont, sb, left + dx, top + dy);
left += (float)alWidths[i];
}
top += lineHeight;
#endregion

#region 打印数据
DataTable dt = (DataTable)gridControl1.DataSource;
int start = (curPage - 1) * linesPerPage;
int end = start + linesPerPage;
if(end > dt.Rows.Count)
{
end = dt.Rows.Count;
}
for(i = start ; i < end ; i ++)
{
DataRow dr = gridView1.GetDataRow(i);
left = leftMargin;
for(j = 0 ; j < alWidths.Count ; j ++)
{
object obj = dr[gridView1.Columns[(int)alIndexs[j]].FieldName];
if(obj != DBNull.Value)
{
g.DrawString(obj.ToString(), font, sb, left + dx, top + dy);
}
left += (float)alWidths[j];
}
top += lineHeight;
}
#endregion

#region 打印表格线
left = leftMargin;
top = topMargin;
// 竖线
for(i = 0 ; i <= alWidths.Count ; i ++)
{
g.DrawLine(pen, new PointF(left, top), new PointF(left, top + (linesPerPage + 1) * lineHeight));
if(i < alWidths.Count)
{
left += (float)alWidths[i];
}
}
left = leftMargin;
top = topMargin;
// 横线
for(i = 0 ; i <= linesPerPage + 1 ; i ++)
{
g.DrawLine(pen, new PointF(left, top), new PointF(left + pageWidth - leftMargin - rightMargin, top));
top += lineHeight;
}
#endregion

// 当前页加一
curPage ++;

// 返回是否还有要打印的页
return (curPage <= totalPage);
}

我用了DevExpress第三方控件,具体代码改一下就可以。
520zyb 2005-09-26
  • 打赏
  • 举报
回复
最后一顶!!!!
520zyb 2005-09-22
  • 打赏
  • 举报
回复
我的问题没人来解决呀
再顶一下
520zyb 2005-09-21
  • 打赏
  • 举报
回复
没人来吗?
顶一下

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧