预览后打印只打印当前显示的一页,预览数据有多页,可以在菜单栏上翻下翻查看。直接打印的话没问题,是打印多页。
 网上说的解决方案都是重新画一遍,在画方法里面用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();
                        }
                    }
                }

解决方案 »

  1.   

    在docToPrint.BeginPrint事件中重置多页打印时用于控制页面的循环变量 
      

  2.   


     请问, 这个是否可以理解为控制 HasMorePages ?
      

  3.   

    比如,你自定义一个窗口级变量用于控制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的
      

  4.   


    关键是 这个是在打印自定义的条码。 不是单纯的打印数据报表。 一定得用Graphics
      

  5.   


     星星, 星星。 弄好了。 。 。但是。。 还是重新去执行了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;
                    }
                }
            }