我现在用winform做了一个打印功能,默认一次是打A4纸大小,而我现在需要打A4纸的五分之一大小,PageSetupDialog1可以进行打印设置,里面没有A4纸的五分之一大小的尺寸,而且我是想默认就是五分之一,能不能直接在代码里面写死

解决方案 »

  1.   

    参考:自己修改看看
    调用pd_PrintPage方法://打印
    PrintDocument printDocument = new PrintDocument();
    printDocument.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
    printDocument.Print ();pd_PrintPage方法://打印A4纸用的变量#region //打印A4纸用的变量 
    DataSet dsPrintInfo;  //存放要打印的信息,资料从DB中获取,表一位SN信息,表二为WO信息 
    private int lineNo;   //存放当前要打印行的行号
    private int lineQty;  //存放总 共要打印的行数,可以是一个估算值,略大于实际行数
    private int printingPageNo = 0; //当前 打印的页号
    #endregion
    private void pd_PrintPage(object sender, PrintPageEventArgs e)
    {
      string strLine;//用于存放当前行打印的信息
      float leftMargin = (e.MarginBounds.Left) * 3 / 4;  //左边距
      float topMargin = e.MarginBounds.Top * 2 / 3;    //顶边距
      float verticalPosition = topMargin;         //初始化垂 直位置,设为顶边距
      Font mainFont = new Font("Courier New", 10);//打印的字 体
      //每页的行数,当打印行数超过这个时,要换页(1.05这个值是根据实际情况中设定的,可 以不要)
      int linesPerPage = (int)(e.MarginBounds.Height * 1.05 / mainFont.GetHeight (e.Graphics));
      //Format of this DocReport#region //Format of this DocReport
      if (printingPageNo == 0) //打印第一页时,需要打印以下头信息
      {
         mainFont = new Font("Courier New", 24, FontStyle.Bold);
        strLine = String.Format("{0,21}", "FQA Report");
         e.Graphics.DrawString(strLine, mainFont, Brushes.Black, leftMargin, verticalPosition, new StringFormat());
        verticalPosition = verticalPosition + mainFont.GetHeight (e.Graphics);
        mainFont = new Font("Courier New", 16, FontStyle.Bold);
        strLine = "Pallet ID:" + dsPrintInfo.Tables[0].Rows [0]["Pallet_ID"].ToString();
        e.Graphics.DrawString(strLine, mainFont, Brushes.Black, leftMargin, verticalPosition, new StringFormat());
         verticalPosition = verticalPosition + mainFont.GetHeight(e.Graphics);
        mainFont = new Font("3 of 9 Barcode", 24, FontStyle.Bold);
        strLine = "*" + dsPrintInfo.Tables[0].Rows[0]["Pallet_ID"].ToString() + "*";
        e.Graphics.DrawString(strLine, mainFont, Brushes.Black, leftMargin * 4, verticalPosition, new StringFormat());
        verticalPosition = verticalPosition + mainFont.GetHeight(e.Graphics);
        mainFont = new Font ("Courier New", 16, FontStyle.Bold);
        strLine = "QCI_PN:" + dsPrintInfo.Tables[0].Rows[0]["PARTNUMBER"].ToString();
         e.Graphics.DrawString(strLine, mainFont, Brushes.Black, leftMargin, verticalPosition, new StringFormat());
        verticalPosition = verticalPosition + mainFont.GetHeight (e.Graphics);
        strLine = "Date :" + DateTime.Now;
         e.Graphics.DrawString(strLine, mainFont, Brushes.Black, leftMargin, verticalPosition, new StringFormat());
        verticalPosition = verticalPosition + mainFont.GetHeight (e.Graphics);
        strLine = "Line :" + dsPrintInfo.Tables[0].Rows[0] ["Mfg_Line"].ToString();
        e.Graphics.DrawString(strLine, mainFont, Brushes.Black, leftMargin, verticalPosition, new StringFormat());
         verticalPosition = verticalPosition + mainFont.GetHeight(e.Graphics);
        strLine = "Model:" + dsPrintInfo.Tables[0].Rows[0]["Model"].ToString();
         e.Graphics.DrawString(strLine, mainFont, Brushes.Black, leftMargin, verticalPosition, new StringFormat());
        verticalPosition = verticalPosition + mainFont.GetHeight (e.Graphics) * 2;
        //linesPerPage:上面的头信息预计占的行数,因此第一页还能打印 (linesPerPage - 15)行
        linesPerPage = linesPerPage - 15;
         //lineQty:lineQty行数大概是表行数加上15
        lineQty = dsPrintInfo.Tables [0].Rows.Count + 15;
      }
      #endregion
      //打印具体的SN,BoxID,PalletID列 表#region //打印具体的SN,BoxID,PalletID列表
      //打印标题头信息
      mainFont = new Font("Courier New", 10);
      strLine = String.Format("{0,-10}", "NO#") +
        String.Format("{0,-25}", "System S/N") +
        String.Format("{0,-25}", "BOX_ID") +
         String.Format("{0,-25}", "Pallet_ID");
      e.Graphics.DrawString (strLine, mainFont, Brushes.Black, leftMargin, verticalPosition, new StringFormat());
      verticalPosition = verticalPosition + mainFont.GetHeight(e.Graphics);
      //打印一 条横线 
      mainFont = new Font("Courier New", 3);
       e.Graphics.DrawLine(new Pen(Color.Black), leftMargin, verticalPosition, e.MarginBounds.Right, verticalPosition);
      verticalPosition = verticalPosition + mainFont.GetHeight(e.Graphics);
      //打印记录集信息
      int count = 0; //当前页 的行数计数
      mainFont = new Font("Courier New", 10);
      //如果(当前页 行计数器)小于(每页可以打印的行数)且(要打印行的行号)小于(总共要打印的行数)
      while (count < linesPerPage && lineNo < this.lineQty)
      {
        if (lineNo < dsPrintInfo.Tables[0].Rows.Count) //由于lineNo用于表中的下标值,因此需要加上该 判断
        {
          string strLineTemp = String.Format("{0,-10}", dsPrintInfo.Tables[0].Rows[lineNo]["NO"].ToString()) +
           String.Format("{0,-25}", dsPrintInfo.Tables[0].Rows[lineNo] ["SN"].ToString()) +
          String.Format("{0,-25}", dsPrintInfo.Tables[0].Rows[lineNo]["BOX_ID"].ToString()) +
           String.Format("{0,-25}", dsPrintInfo.Tables[0].Rows[lineNo] ["Pallet_ID"].ToString());
          e.Graphics.DrawString(strLineTemp, mainFont, Brushes.Black, leftMargin, verticalPosition, new StringFormat());
           verticalPosition = verticalPosition + mainFont.GetHeight(e.Graphics);
           count++; //注意:这句要放到If中,否则,如果实际只有一页的话,尾信息会跑到第二页去
         }
        lineNo++;
      }
      #endregion
      //如果总行数大于目前实 际行号,表明还有页要打,lineQty是估计数,因此实际用时要仔细估算
      if (lineQty > lineNo) 
      {
        e.HasMorePages = true;
      }
      else
       {
        e.HasMorePages = false;
      }
      //打印结尾信息#region //打印结尾 信息
      if (!e.HasMorePages)
      {
        mainFont = new Font("Courier New", 10);
        e.Graphics.DrawLine(new Pen(Color.Black), leftMargin, verticalPosition, e.MarginBounds.Right, verticalPosition);
        verticalPosition = verticalPosition + mainFont.GetHeight(e.Graphics);
        foreach (DataRow dr in dsPrintInfo.Tables[1].Rows)
        {
          mainFont = new Font ("Courier New", 16);
          strLine = String.Format("{0,-3}", "WO:") + String.Format("{0,-16}",dr["WO"].ToString())
             + String.Format("{0,-7}", "Qty:") + String.Format(" {0,-10}",dr["Qty"].ToString());
          e.Graphics.DrawString (strLine, mainFont, Brushes.Black, leftMargin, verticalPosition, new StringFormat());
          verticalPosition = verticalPosition + mainFont.GetHeight(e.Graphics);
         }
        foreach (DataRow dr in dsPrintInfo.Tables[2].Rows)
        {
           mainFont = new Font("Courier New", 16);
          strLine = String.Format("{0,-9}", "TotalQty:") + String.Format("{0,-10} ", dr["TotalQty"].ToString())
            + String.Format("{0, -7}", "BoxQty:") + String.Format("{0,-10}",dr ["BoxQty"].ToString());
          e.Graphics.DrawString(strLine, mainFont, Brushes.Black, leftMargin, verticalPosition, new StringFormat());
           verticalPosition = verticalPosition + mainFont.GetHeight(e.Graphics);
        }
       }
      #endregion
      printingPageNo++; //页号加一
    }
      

  2.   

    e.HasMorePages = false;
    是这个吗?这个是说还要不要继续再打的意思吧,打到A4纸的五分之一就不打了,
    谢谢支持
     private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
            {
                Graphics gDraw = e.Graphics;
                Pen pen = new Pen(Color.Black, 1);                                                       //打印画笔
                Font font = new Font("宋体", 12);            //文本字体
                Font fontNum = new Font("宋体", 14); 
                Font fontTitle = new Font("宋体", 16,
                    System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));    //单据标题字体            Rectangle rc = new Rectangle();             //在此矩形框内打印
                StringFormat strFormat = new StringFormat();
                strFormat.Alignment = StringAlignment.Center;//居中 Alignment:垂直面上 LineAlignment:水平面上。            rc.X = 270;             //定义位置和大小
                rc.Y = 5;
                rc.Width = 300;
                rc.Height = 50;            gDraw.DrawString(“建材厂”, fontTitle, Brushes.Black, rc, strFormat); //画单据标题
                 内容略
                       }
      

  3.   

    直接把纸张设置大小就行了
              printDocument.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
                printDocument.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("bq", 354, 236);