始终相信CSDN有高手的,跪求e.HasMorePage问题

时间:2022-12-19 11:43:07
这个问题憋了好几天了,CSDN那么多高人,为什么好像一问到多页打印就好像没几个人知道呢?

用得话我QQ发源代码,因为C#新手不会水晶报表。只能用基本的循环和 PrintDocument做。

胶贴打印:每页50格(每行10格,共5行)。 打印50格启用分页。现在多页打印时候有问题,在代码里加了MessageBox跟踪,
尝试打印55格,预览的时候可以看到,先循环提示了50次,然后再提示:分页成功!,然后再提示5次。
但是预览的时候始终就只有1页。下面有代码和预览截图。

请各位大侠们行行好,帮帮忙。多有多答,少有少说。一句半句,我不在乎。这里跪求了



 PrintDocument printer = new PrintDocument();
        private string[] lines;//打印行内容;
        private int pages_int = 50;//每页打印多少格;
        private int currentrow = 0;//当前打印到多少格

        private void OnPrintPage(object sender, PrintPageEventArgs e)
        {
            
            Graphics g = e.Graphics;//初始化边框;
            int x = 50; //商品信息打印的开始横坐标;
            int y = 60; //商品信息打印的开始纵坐标;
            int border_x = 40;  //价签边框打印的开始横坐标;
            int border_y = 40;  //价签边框打印的开始纵坐标;
            int border_w = 110;  //价签边框的宽度;
            int border_h = 150;  //价签边框的高度;
            int sums = 0;//边框数量合变量;    
            int font_sunms = 0;//打印内容的数量的合;
           
            for (int z = 0; z < data_list.Rows.Count - 1; z++)
            {
                //计算第字段“数量”列的和,计算需要打印的边框数个数
                sums = sums + int.Parse(data_list.Rows[z].Cells[6].Value.ToString().Trim());
            }
            for (int i = 0; i < sums; i++)
            {
                //边框位置计算,每行10个格,打印10格后换行
                //打印50格后重新计算位置
                if (sums >=50)
                {
                    //多页打印边框位置重计算
                    if (i % 10 == 0)
                    {
                        if (i % 50 == 0)
                        {
                            //多页打印首格位置
                            border_x = 40;
                            border_y = 40;
                        }
                        else
                        {
                            //10格换行
                            border_x = 40;
                            border_y = border_y + border_h;
                        }
                    }
                    else
                    {
                        //打印一个格后,右移动坐标 
                        border_x = border_x + border_w;
                    }
                }
                else
                {
                    {
                        if (i % 10 == 0)
                        {
                            if (i == 0)
                            {
                                //首格位置
                                border_x = 40;
                                border_y = 40;
                            }
                            else
                            {
                                //10格换行
                                border_x = 40;
                                border_y = border_y + border_h;
                            }
                        }
                        else
                        {
                            //打印一个格后,右移动坐标 
                            border_x = border_x + border_w;
                        }
                    }
                }
                //装入打印信息
                g.DrawRectangle(new Pen(Color.Black, 1), border_x, border_y, border_w, border_h);
            }
            
            //循环遍历DataGridView中的所有行,取得打印内容和位置
            for (int j = 0; j < data_list.Rows.Count - 1; j++)
            {
                //每条记录的打印数量
                for (int p = 0; p < int.Parse(data_list.Rows[j].Cells[6].Value.ToString()); p++)
                {
                    font_sunms = font_sunms + 1;          

                    foreach (object cell in data_list.Rows[j].Cells)
                    {                  
                        //判断DataGridView是否为空
                        DataGridViewCell d = (DataGridViewCell)cell;
                        if (d.Value == null)
                        {
                            MessageBox.Show("数据输入不完整", "错误提示");
                            return;
                        }

                        //取得DATAGRIDVIEW单行的内容
                        if (data_list.Rows[j].Cells[0].Value.ToString().Length > 7)
                        {
                            t_text.Text = "-----------------------------" + '\n' + '\n' + "品名:" +
                            data_list.Rows[j].Cells[0].Value.ToString().Substring(0, 6).Trim() +
                             '\n' + data_list.Rows[j].Cells[0].Value.ToString().Substring(6, data_list.Rows[j].Cells[0].Value.ToString().Length - 6).Trim() +
                            '\n' + "货号:" + data_list.Rows[j].Cells[1].Value.ToString() + '\n' + "规格:" + 
                            data_list.Rows[j].Cells[2].Value.ToString() + '\n' + "产地:" +
                            data_list.Rows[j].Cells[3].Value.ToString().Trim() + '\n' +
                            "单位:" + data_list.Rows[j].Cells[4].Value.ToString().Trim() + '\n' + 
                            "零售价:" + data_list.Rows[j].Cells[5].Value.ToString().Trim();
                        }
                        else
                        {
                            t_text.Text = "-----------------------------" + '\n' + '\n' + "品名:" + 
                            data_list.Rows[j].Cells[0].Value.ToString().Trim() +
                            '\n' + "货号:" + data_list.Rows[j].Cells[1].Value.ToString() + '\n' + "规格:" 
                            + data_list.Rows[j].Cells[2].Value.ToString() + '\n' + "产地:" +
                            data_list.Rows[j].Cells[3].Value.ToString().Trim() + '\n' +
                            "单位:" + data_list.Rows[j].Cells[4].Value.ToString().Trim() +
                            '\n' + "零售价:" + data_list.Rows[j].Cells[5].Value.ToString().Trim();
                        }
                        //将单行信息放入控件                            
                        lines = t_text.Text.Split('\r');
                    }
                    //DataGridView单行打印位置计算   
                    if (font_sunms >= 50)
                    {
                        //多页打印位置重新定义,如果大于50格
                        if (font_sunms % 10 == 0)
                        {
                            if (font_sunms % 50 == 0)
                            {
                                //首格位置
                                x = 50;
                                y = 60;
                            }
                            else
                            {
                                //打印10格换行
                                x = 50;
                                y = y + border_h;
                            }
                        }
                        else
                        {
                            //坐标右移动
                            x = x + border_w;
                        }
                    }
                    else
                    {
                        if (font_sunms % 10 == 0)
                        {
                            if (font_sunms == 0)
                            {
                                //首格位置
                                x = 50;
                                y = 60;
                            }
                            else
                            {
                                //打印10格换行
                                x = 50;
                                y = y + border_h;
                            }
                        }
                        else
                        {
                            //打印一个格后,右移动坐标
                            x = x + border_w;
                        }
                    }
                        currentrow ++;//打印第N格
                        MessageBox.Show(currentrow.ToString(),"已经打印了多少格,用来做分页");
                        if (currentrow >= pages_int)
                        {
                            e.HasMorePages = true;
                            MessageBox.Show("分页成功!", "分页情况");
                            currentrow = currentrow - pages_int;
                        }
                        else
                        {
                            e.HasMorePages = false;
                        }
                        foreach (string line in lines)
                        {
                            e.Graphics.DrawString(line, new Font("Arial", 7), Brushes.Black, x, y);
                        }  
                }
 
            }
            sums = 0;    
            font_sunms = 0;
            currentrow = 0;
            lines = null;     
       }


始终相信CSDN有高手的,跪求e.HasMorePage问题

始终相信CSDN有高手的,跪求e.HasMorePage问题

始终相信CSDN有高手的,跪求e.HasMorePage问题

始终相信CSDN有高手的,跪求e.HasMorePage问题

12 个解决方案

#3


加了好几个群,把代码发给他们就都没消息了。难过

#4


有人说水晶报表,可以是 水晶报表 看起来不能实现这个啊

#5


链接你看了?

#6


   if (PageIndex < PageCount)
            {
                e.HasMorePages = true;
                PageIndex++;
            }
            else
            {
                e.HasMorePages = false;
                PageIndex = 1;
            }

以前写的分页就是这样写的,看你的也是正确的,不知道哪里错了。

#7


我这里是vs2008,如果能编译你的代码,就发给邮件。
mjp1234airen4385@163.com

#8


真的非常感谢呀 能加QQ么?

#9


已经发到你邮箱了,太感谢了。

#10


引用 4 楼 zln0118 的回复:
有人说水晶报表,可以是 水晶报表 看起来不能实现这个啊


看是看了 但是以前在查资料的时候都看过.

#11


你的代码我看了下,有问题。
(1)e.HasMorePages 用的位置不对。
(2)分页使用的方法不对。

第一个问题,会导致分页不成功。
第二个问题,会导致数据重复,每一页都是相同的数据。


已经帮你改动了,但是没有加注释。功能是完成了。
已经发到你邮箱了。

#12


非常感谢 

#1


#2


#3


加了好几个群,把代码发给他们就都没消息了。难过

#4


有人说水晶报表,可以是 水晶报表 看起来不能实现这个啊

#5


链接你看了?

#6


   if (PageIndex < PageCount)
            {
                e.HasMorePages = true;
                PageIndex++;
            }
            else
            {
                e.HasMorePages = false;
                PageIndex = 1;
            }

以前写的分页就是这样写的,看你的也是正确的,不知道哪里错了。

#7


我这里是vs2008,如果能编译你的代码,就发给邮件。
mjp1234airen4385@163.com

#8


真的非常感谢呀 能加QQ么?

#9


已经发到你邮箱了,太感谢了。

#10


引用 4 楼 zln0118 的回复:
有人说水晶报表,可以是 水晶报表 看起来不能实现这个啊


看是看了 但是以前在查资料的时候都看过.

#11


你的代码我看了下,有问题。
(1)e.HasMorePages 用的位置不对。
(2)分页使用的方法不对。

第一个问题,会导致分页不成功。
第二个问题,会导致数据重复,每一页都是相同的数据。


已经帮你改动了,但是没有加注释。功能是完成了。
已经发到你邮箱了。

#12


非常感谢