首页 新闻 赞助 找找看

C#打印分页的一点小问题。大神解释一下吧。谢谢了。

0
[已解决问题] 解决于 2017-05-05 14:50

下面的代码是分页打印的代码。以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;

        }

1sa2sa的主页 1sa2sa | 菜鸟二级 | 园豆:289
提问于:2017-05-05 11:42
< >
分享
最佳答案
0

它是作为一个定位作用,  行高*1 时候  为第一行,行高*2时 为第二行   这个1、2就是flag ,循环一次加一次,直到循环完成,重新赋值为0

奖励园豆:5
十一一十三 | 菜鸟二级 |园豆:247 | 2017-05-05 14:20

谢谢你。我知道我的问题错在哪里了。

1sa2sa | 园豆:289 (菜鸟二级) | 2017-05-05 14:40
其他回答(1)
0

 g.DrawString(dataGridView1.Rows[i].Cells[0].Value,...,行高值*flag,...);

给这句代码用的...

爱编程的大叔 | 园豆:30839 (高人七级) | 2017-05-05 14:20

您好,我自己写的代码里并没有用到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去计算行高。这是怎么回事呢?

支持(0) 反对(0) 1sa2sa | 园豆:289 (菜鸟二级) | 2017-05-05 14:24

@1sa2sa: 说得好像你加上就行似的...

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2017-05-05 14:33

@爱编程的大叔: 我知道我错在哪里了。跟那个没有关系。而且我也用不着那个。不过谢谢你了。

支持(0) 反对(0) 1sa2sa | 园豆:289 (菜鸟二级) | 2017-05-05 14:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册