下面的代码是分页打印的代码。以datagridview为例的,是拷贝过来的,试验过了,不错。但是有一个疑问:
就是里面的一个变量,int flag ,在第二个循环中。没有它不行的。但是不知道怎么去理解这个变量。大神可否为俺讲解一下。谢谢了。
(1)设置起始页与总页数:
int a=0; //起始页
int b=1; //总页数
(2)在DataGridView绑定后对总页数重新赋值(以每页打印25行数据为例):
b=Convert.ToInt32(dataGridView1.RowCount/25);
(3)自定义布尔函数,判断是否为多页打印:
private bool myPrint(Graphics g)
{
a+=1;
g.drawString("第"+a.Tostring()+"页");
if(a<b)
{
for(int i=0;i<25;i++)
{
g.DrawString(dataGridView1.Rows[(a-1)*25+i].Cells[0].Value,...,行高值*i,...);
}
}
else
{
int flag=0;
for(int i=25*(a-1);i<dataGridView1.RowCount;i++)
{
flag++;
g.DrawString(dataGridView1.Rows[i].Cells[0].Value,...,行高值*flag,...);
}
}
if(a<b)
{
return true;
}
return false;
}
(4) 在printPage事件中写入如下代码:
if(myPrint(e.Graphics))
{
e.HasMorePages=true;
}
else
{
e.HasMorePages=false;
a=0;
b=0;
}
它是作为一个定位作用, 行高*1 时候 为第一行,行高*2时 为第二行 这个1、2就是flag ,循环一次加一次,直到循环完成,重新赋值为0
谢谢你。我知道我的问题错在哪里了。
g.DrawString(dataGridView1.Rows[i].Cells[0].Value,...,行高值*flag,...);
给这句代码用的...
您好,我自己写的代码里并没有用到flag变量。
int flag = 0;
for (int j = 20 * (a - 1); j < list.Count; j++)
{
flag++;
g.DrawLine(Pens.Black, 20, yy, 800, yy);//画横线
g.DrawLine(Pens.Black, 20, yy, 20, yy + 30);//画竖线
g.DrawString(iid.ToString(), new Font(new FontFamily("宋体"), 12, FontStyle.Regular),
System.Drawing.Brushes.Black,
30, yy + 10);
g.DrawLine(Pens.Black, 150, yy, 150, yy + 30);//画竖线
g.DrawString(list[j].ToString(), new Font(new FontFamily("宋体"), 12, FontStyle.Regular),
System.Drawing.Brushes.Black,
180, yy + 10);
g.DrawLine(Pens.Black, 440, yy, 440, yy + 30);//画竖线
g.DrawString(list1[j].ToString(), new Font(new FontFamily("宋体"), 12, FontStyle.Regular),
System.Drawing.Brushes.Black,
470, yy + 10);
g.DrawLine(Pens.Black, 800, yy, 800, yy + 30);//画竖线
yy += 30;
g.DrawLine(Pens.Black, 20, yy, 800, yy);
iid++;
}
然而如果去掉它还是不行的。打印出来的行数一直是根据打印的次数往上累加。我的代码里并没有用到flag去计算行高。这是怎么回事呢?
@1sa2sa: 说得好像你加上就行似的...
@爱编程的大叔: 我知道我错在哪里了。跟那个没有关系。而且我也用不着那个。不过谢谢你了。