C#预览后打印问题。有碰到过这个问题没

wfy_330 2010-09-01 10:55:19
预览后打印只打印当前显示的一页,预览数据有多页,可以在菜单栏上翻下翻查看。直接打印的话没问题,是打印多页。
网上说的解决方案都是重新画一遍,在画方法里面用e.HasMorePages来控制是否有更多页。 但是我在预览的时候已经画过一次,不想在点预览上面的打印按钮时在去重新执行画方法。现在就有没有可能,直接点菜单栏的打印按钮,就打印出所有的页面出来。。 弄了跟多办法, 就是没达到效果。beginprint事件里面取消打印,然后new一个新的document,printpage后print,这个。。 这个, 出来是空白页面。,还有tStrip.Items[0].MouseDown +=新打印, 一样空白页面。下面部分代码, 像word里面的打印预览,如果多页的话是出现的一个下滑条,所有页都直接列出来的,可否实现这样的效果, 或是有别的更好的效果? 谢谢了, 分也不知道还剩多少, 可能叙述多了反而不清楚了, 如果有疑问可以回复提问。 谢谢。

docToPrint = new PrintDocument();
docToPrint.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
//docToPrint.BeginPrint += new PrintEventHandler(BegPrint);
//docToPrint.EndPrint += new PrintEventHandler(EndsPrint);
this.pageSetupDialog1.Document = docToPrint;
DialogResult ds = this.pageSetupDialog1.ShowDialog();
if (checkBoxyl.Checked)//打印前预览
{

prd = new PrintPreviewDialog();
prd.Document = docToPrint;
ToolStrip tStrip = (ToolStrip)prd.Controls[1];
//tStrip.Items[0].MouseDown += new MouseEventHandler(moustdown);重新执行画方法进行打印
prd.PrintPreviewControl.Zoom = 1;//设置打印预览为100%
if (ds == DialogResult.OK)
{
prd.Document.PrinterSettings = pageSetupDialog1.PrinterSettings;//设置选择的打印机
//IsYl = true;是否预览
prd.ShowDialog();
}
}
else
{
if (ds == DialogResult.OK)
{
docToPrint.PrinterSettings = pageSetupDialog1.PrinterSettings;
docToPrint.DefaultPageSettings = pageSetupDialog1.PageSettings;
//docToPrint.DefaultPageSettings = pageSetupDialog1.PageSettings;
docToPrint.EndPrint += new PrintEventHandler(EndsPrint);
this.printDialog1.Document = docToPrint;
DialogResult result = this.printDialog1.ShowDialog();
if (result == DialogResult.OK)
{
docToPrint.Print();
}
}
}



...全文
227 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfy_330 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jointan 的回复:]
在docToPrint.BeginPrint事件中重置多页打印时用于控制页面的循环变量
[/Quote]

请问, 这个是否可以理解为控制 HasMorePages ?
wfy_330 2010-09-01
  • 打赏
  • 举报
回复
人。nie
jointan 2010-09-01
  • 打赏
  • 举报
回复
在docToPrint.BeginPrint事件中重置多页打印时用于控制页面的循环变量
wfy_330 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jointan 的回复:]
比如,你自定义一个窗口级变量用于控制HasMorePages
private int n=0;
而你打印的页有m页;
PrintPage事件中:
{
n++;//当前页码
//执行打印绘制代码
e.HasMorePage=(n!=m);//如果当前页码等于总页数,结束打印绘制,否则打印下一页
}
这种情况下,你需要在Begin事件中,重置n为0,因为你点击打印预览中的打印按钮时,……
[/Quote]

星星, 星星。 弄好了。 。 。但是。。 还是重新去执行了PrintPage事件。

我发下我的PrintPage事件代码。。。。


void printDoc_PrintPage(object sender, PrintPageEventArgs e)
{
int[] number = new int[marterialName.Count];//打印张数
int[] residue = new int[marterialName.Count];//求余
topPagesLocationX = 0;
topPagesLocationY = 0;
HostControl hc = CurrentDocumentsHostControl;
IDesignerHost idh = (IDesignerHost)hc.DesignerHost.GetService(typeof(IDesignerHost));
Control rootControl = (Control)idh.RootComponent;
string strSql = string.Empty;
if (isBeLongBill)
{
DialogResult dr = MessageBox.Show("您的方案没有活动的数据,是否继续?", "Fesem 提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (DialogResult.Yes == dr)
{
DrawTabPageImageNotDate(e, idh, rootControl);
return;
}
else
{
return;
}
}
else if (orderNo.Count < 1)
{
DrawTabPageImageNotDate(e, idh, rootControl);
return;
}

if (Convert.ToInt32(labelCount1[z])> 0)
{
rootControl.BackColor = Color.White;
e.Graphics.FillRectangle(new SolidBrush(rootControl.BackColor), 0, 0, rootControl.Width, rootControl.Height);
}
Boolean selectBeLongBill = false;
if (Convert.ToInt32(labelCount1[z]) > 0)
{
foreach (IComponent subControl in idh.Container.Components)
{
if (subControl.GetType() == typeof(CustomLabel))
{
CustomLabel clst = subControl as CustomLabel;
if (clst.BeLongBill == "销售订单")
{
selectBeLongBill = true;
}
else
{
selectBeLongBill = false;
}
break;
}
}

#region 按标签中的数量及出货数量算出此张订单要打印的数量.
if ((int)openCount[z] > 0 && openCount[z].ToString() != "" && (int)labelCount1[z] > 0 && labelCount1[z].ToString() != "")
{
number[z] = (int)openCount[z] / (int)labelCount1[z];
residue[z] = (int)openCount[z] % (int)labelCount1[z];
}
if (residue[z] > 0)
number[z] = number[z] + 1;
#endregion

if (selectBeLongBill)
{
//--------------------------------------------------------wfy
string[] strsa = new string[] { "exec fs_PsaleoutPrintBarCode_1 '{0}','{1}'", "exec fs_PsaleoutPrintBarCode_HK '{0}','{1}'" };
strSql = string.Format(CommonLibrary.DatabaseAdd.GetSql(strsa), orderNo[z], marterialName[z]);
}
else
{
//--------------------------------------------------------wfy
string[] strsa = new string[] { "exec fs_POutInHousePrintBarCode_1 '{0}','{1}'", "exec fs_POutInHousePrintBarCode_HK '{0}','{1}'" };
strSql = string.Format(CommonLibrary.DatabaseAdd.GetSql(strsa), orderNo[z], marterialName[z]);
}
DataTable dt = DBHelper.ExecuteGetDataTable(CommandType.Text, strSql, null);
int rownum = -1;//当前行号
if (billno == "")//这里判断是否是同一订单,不是的话rowsnum清零
{
billno = orderNo[z].ToString();
}
else if (billno != orderNo[z].ToString())
{
billno = orderNo[z].ToString();
rowsnum = 0;
}
bool notsaleispch = false;
if (dt != null && dt.Rows.Count > 0)
{
if (!selectBeLongBill)
{
if (dt.Rows[0]["forderbillno"].ToString().IndexOf(seordstr) >= 0)
{
//原单号
string yuandanhao = dt.Rows[0]["forderbillno"].ToString();
//出入库单号
string churukudanhao = dt.Rows[0]["fbillno"].ToString();
//
string asql = "select sum(fqty) from icstockbill t1 inner join icstockbillentry t2 on t1.finterid = t2.finterid where fbillno < '" + churukudanhao + "' and forderbillno = '" + yuandanhao + "'";
object yqnum = DBHelper.ExecuteScalar(CommandType.Text, asql, null);
//object thisnum = dt.Rows[0]["fauxqty"];//fauxqty
//
int take;//要取值的条数
int skip;//要跳过的条数
try
{
take = number[z];
skip =yqnum.ToString()!=""? Convert.ToInt32(yqnum) / (int)labelCount1[z]:0;
}
catch (Exception)
{
throw;
}
string sqlad = "select top " + take + " * from fsxsck where ckid not in (select top " + skip + " ckid from fsxsck where ponumber='" + yuandanhao + "' ) and ponumber='" + yuandanhao + "' ";

DataTable dt1 = DBHelper.ExecuteGetDataTable(CommandType.Text, sqlad, null);
if (dt1.Rows.Count > 0)
{
notsaleispch = true;
DataTable dts = dt.Copy();
dt.Rows.Clear();
foreach (DataRow item in dt1.Rows)
{
DataRow newrow = dt.NewRow();
dts.Rows[0]["pch"] = item["Lotnum"];
//newrow["pch"] = item["Lotnum"];
newrow.ItemArray = dts.Rows[0].ItemArray;
dt.Rows.Add(newrow);
}
}
}

}
foreach (DataRow dr in dt.Rows)
{
//-----------------
if (selectBeLongBill||notsaleispch)
{
if (dt.Rows.Count > 1)
{
rownum++;
if (rowsnum != rownum)
{
continue;
}
}
}
//具体画操作
rowsnum++;
}
}
else
{
DrawTabPageImageNotDate(e, idh, rootControl);
}
}
if (z <orderNo.Count)
{
if(Convert.ToInt32(labelCount1[z])>0)
zForCount++;
if (w[z] >= number[z])
{
e.HasMorePages = false;
}
else
{
e.HasMorePages = true;
w[z]++;
return;
}
if (Convert.ToInt32(inBoxCount[z]) > 0 && zForCount == w[z])
{
labelCount1 = inBoxCount;
wz = w[z];
w[z] = 1;
e.HasMorePages = true;
return;
}
if (Convert.ToInt32(outBoxCount[z]) > 0 && zForCount == wz + w[z])
{
labelCount1 = outBoxCount;
outZ = w[z];
w[z] = 1;
e.HasMorePages = true;
return;
}
if (this.radioButton3.Checked && zForCount == outZ+wz + w[z])
{
labelCount1 = openCount;
w[z] = 1;
e.HasMorePages = true;
return;
}
z++;
wz = 0;
outZ = 0;
zForCount = 0;
if (z < orderNo.Count)
{
labelCount1 = labelCount;
w[z] = 1;
e.HasMorePages = true;
return;
}
else
{
e.HasMorePages = false;
z = 0;
}
}
}

wfy_330 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jointan 的回复:]
比如,你自定义一个窗口级变量用于控制HasMorePages
private int n=0;
而你打印的页有m页;
PrintPage事件中:
{
n++;//当前页码
//执行打印绘制代码
e.HasMorePage=(n!=m);//如果当前页码等于总页数,结束打印绘制,否则打印下一页
}
这种情况下,你需要在Begin事件中,重置n为0,因为你点击打印预览中的打印按钮时,……
[/Quote]

试一下先。
wfy_330 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiemeilin 的回复:]
我觉得最简单就是用水晶报表了,不用画东西。
[/Quote]

关键是 这个是在打印自定义的条码。 不是单纯的打印数据报表。 一定得用Graphics
xiemeilin 2010-09-01
  • 打赏
  • 举报
回复
我觉得最简单就是用水晶报表了,不用画东西。
jointan 2010-09-01
  • 打赏
  • 举报
回复
比如,你自定义一个窗口级变量用于控制HasMorePages
private int n=0;
而你打印的页有m页;
PrintPage事件中:
{
n++;//当前页码
//执行打印绘制代码
e.HasMorePage=(n!=m);//如果当前页码等于总页数,结束打印绘制,否则打印下一页
}
这种情况下,你需要在Begin事件中,重置n为0,因为你点击打印预览中的打印按钮时,n的当前值与m是相同的,导致PrintPage在执行完一次后,e.HasMorePage已经是false了

我估计你摸述的情况的原因和我描述的原理差不多,具体原因出在哪,需要你提供printDoc_PrintPage的代码中e.HasMorePage赋值的判断部分,即,你是通过什么决定e.HasMorePage=true或false的

110,561

社区成员

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

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

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