用得话我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;
}
12 个解决方案
#2
#3
加了好几个群,把代码发给他们就都没消息了。难过
#4
有人说水晶报表,可以是 水晶报表 看起来不能实现这个啊
#5
链接你看了?
#6
if (PageIndex < PageCount)
{
e.HasMorePages = true;
PageIndex++;
}
else
{
e.HasMorePages = false;
PageIndex = 1;
}
以前写的分页就是这样写的,看你的也是正确的,不知道哪里错了。
{
e.HasMorePages = true;
PageIndex++;
}
else
{
e.HasMorePages = false;
PageIndex = 1;
}
以前写的分页就是这样写的,看你的也是正确的,不知道哪里错了。
#7
我这里是vs2008,如果能编译你的代码,就发给邮件。
mjp1234airen4385@163.com
mjp1234airen4385@163.com
#8
真的非常感谢呀 能加QQ么?
#9
已经发到你邮箱了,太感谢了。
#10
看是看了 但是以前在查资料的时候都看过.
#11
你的代码我看了下,有问题。
(1)e.HasMorePages 用的位置不对。
(2)分页使用的方法不对。
第一个问题,会导致分页不成功。
第二个问题,会导致数据重复,每一页都是相同的数据。
已经帮你改动了,但是没有加注释。功能是完成了。
已经发到你邮箱了。
(1)e.HasMorePages 用的位置不对。
(2)分页使用的方法不对。
第一个问题,会导致分页不成功。
第二个问题,会导致数据重复,每一页都是相同的数据。
已经帮你改动了,但是没有加注释。功能是完成了。
已经发到你邮箱了。
#12
非常感谢
#1
#2
http://topic.csdn.net/t/20061211/11/5221408.html
http://www.cnblogs.com/-clq/archive/2011/08/11/2135129.html
http://www.cnblogs.com/-clq/archive/2011/08/11/2135129.html
#3
加了好几个群,把代码发给他们就都没消息了。难过
#4
有人说水晶报表,可以是 水晶报表 看起来不能实现这个啊
#5
链接你看了?
#6
if (PageIndex < PageCount)
{
e.HasMorePages = true;
PageIndex++;
}
else
{
e.HasMorePages = false;
PageIndex = 1;
}
以前写的分页就是这样写的,看你的也是正确的,不知道哪里错了。
{
e.HasMorePages = true;
PageIndex++;
}
else
{
e.HasMorePages = false;
PageIndex = 1;
}
以前写的分页就是这样写的,看你的也是正确的,不知道哪里错了。
#7
我这里是vs2008,如果能编译你的代码,就发给邮件。
mjp1234airen4385@163.com
mjp1234airen4385@163.com
#8
真的非常感谢呀 能加QQ么?
#9
已经发到你邮箱了,太感谢了。
#10
看是看了 但是以前在查资料的时候都看过.
#11
你的代码我看了下,有问题。
(1)e.HasMorePages 用的位置不对。
(2)分页使用的方法不对。
第一个问题,会导致分页不成功。
第二个问题,会导致数据重复,每一页都是相同的数据。
已经帮你改动了,但是没有加注释。功能是完成了。
已经发到你邮箱了。
(1)e.HasMorePages 用的位置不对。
(2)分页使用的方法不对。
第一个问题,会导致分页不成功。
第二个问题,会导致数据重复,每一页都是相同的数据。
已经帮你改动了,但是没有加注释。功能是完成了。
已经发到你邮箱了。
#12
非常感谢