仅供参考:http://blog.csdn.net/landlordh/archive/2004/11/23/192119.aspx

解决方案 »

  1.   

    以前寫的希望對你有用!寫的不好多多見諒
    //打印
    case 1:
    try
    {
    //設置要打印的內容
    PrintDocument printdoc = new PrintDocument();
    printdoc.PrinterSettings.PrinterName = sPrinterName;
    printdoc.PrintPage += new PrintPageEventHandler(this.print);
    printdoc.Print();
    //更新數據庫--CUSTOM_ORDER-ORDER_STATE[Y-OUT][N-NO OUT]
    UpdateState();
    函數PRINT()
    #region output to the print
    private void print(object sender,PrintPageEventArgs e)
    {
    try
    {
    //調用打印函數
    draw(e.Graphics,oDs,sComName,sPhoneNo,true);
    }
    catch(Exception err)
    {
    MessageBox.Show(err.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
    }
    }函數DRAW()
    private void draw(Graphics g,DataTable oTable,string sCompany,string sPhone,bool FlagPrint)
    {
    try
    {
    //定義畫圖對像[可將bitmap,graphics對像設為全局參數]
    //可以將畫記錄的部分重新調用
    Bitmap theImage =new Bitmap(this.ptbView.Width,this.ptbView.Height);
    //如果是打印的話則不建立對像
    if(!FlagPrint)
    {
    //建立畫圖對像
    g = Graphics.FromImage(theImage);

    //畫布的背景為白色
    g.Clear(Color.White);
    }

    //畫圖方式為右到左
    StringFormat sFormat = new StringFormat(StringFormatFlags.DirectionRightToLeft);
    //圖像質量為高畫質
    g.SmoothingMode = SmoothingMode.HighQuality;
    g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
    //調用畫表與尾函數
    PrintHead(g,x.SelectSingleNode("//START/REP_HEAD").InnerText,sCompany,sPhone);
    //計算總共內容有多少頁10條記錄為一頁
    int nRows = 0;
    if(oTable.Rows.Count>=10)
    {
    nRows = oTable.Rows.Count/10;
    }
    else
    {
    nRows = 1;
    }
    //計算總總價
    double nTotal =0;
    //如果記錄在十行或十行之內,則真接放到預覽窗口中
    if(oTable.Rows.Count <= 10)
    {
    for(int i = 0;i<oTable.Rows.Count;i++)
    {
    //行到頁頂部的距離行與行之間的高度為18
    //待改為可以根據字體的大小改變
    int k = 0;
    int lenth = 18*(i+1)+75+k;
    //第一列記錄
    g.DrawString (oTable.Rows[i][0].ToString() ,headFont,Brushes.Black,30 ,lenth);
    //如果列畫不完則換行
    if(oTable.Rows[i][1].ToString().Length>17)
    {
    g.DrawString (oTable.Rows[i][1].ToString().Substring(0,17) ,headFont,Brushes.Black,180 ,18*(i+1)+50+k);

    string srows=oTable.Rows[i][1].ToString().Substring(18);
    g.DrawString(srows,headFont,Brushes.Black,180,18*(i+1)+65+k);
    k = 18*(i+1);
    }
    //可以畫完則不換行
    else
    {
    g.DrawString (oTable.Rows[i][1].ToString() ,headFont,Brushes.Black,180 ,lenth);
    k = 0;
    }
    //畫出其他的列
    g.DrawString (oTable.Rows[i][2].ToString() ,headFont,Brushes.Black,410 ,lenth,sFormat);
    g.DrawString (oTable.Rows[i][3].ToString() ,headFont,Brushes.Black,490 ,lenth,sFormat);
    g.DrawString (oTable.Rows[i][4].ToString() ,headFont,Brushes.Black,570 ,lenth,sFormat);
    //計算總量
    nTotal += double.Parse(oTable.Rows[i][4].ToString());
    }
    //打印出總價
    string sRmb = x.SelectSingleNode("//START/PRINT_RMB").InnerText;
    string sTotal = x.SelectSingleNode("//START/PRINT_TOTAL").InnerText;
    g.DrawString(sTotal+nTotal.ToString()+sRmb,headFont,Brushes.Black,570,18*(10+1)+80,sFormat);   
    //判斷是不是輸出到打印機上
    if( FlagPrint == false)
    {
    //進行回收資源
    if(ptbView.Image != null )
    {
    Image img = ptbView.Image;
    ptbView.Image = null;
    img.Dispose();
    }
    //在picturebox中顯示
    ptbView.Image = theImage;
    }
    //回收資源
    //theImage.Dispose();
    g.Dispose();
    }
    else
    {
    //設定第次打印的行數
    int i = 0;
    //如果行數/頁數(10行每頁)不余0則加一頁
    int nZero = oDs.Rows.Count%10;
    if(nZero != 0)
    {
    nRows = nRows+1;
    }
    //循環畫出所有部分
    for(int nR = 1; nR < nRows+1;nR++)
    {


    //清除上次畫的
    g.Clear(Color.White);
    //調用畫表與尾函數
    PrintHead(g,x.SelectSingleNode("//START/REP_HEAD").InnerText,sCompany,sPhone);

    //行到頁頂部的距離行與行之間的高度為18
    //待改為可以根據字體的大小改變
    int k = 0;

    for(int j = 0;j<10;j++)
    {
    //如果行數超出總行數則跳出循環
    if(i>=oDs.Rows.Count)
    {
    break;
    }
    int lenth = 18*(j+1)+75+k;
    //第一列記錄
    g.DrawString (oTable.Rows[i][0].ToString() ,headFont,Brushes.Black,30 ,lenth);
    //如果列畫不完則換行
    if(oTable.Rows[i][1].ToString().Length>17)
    {
    g.DrawString (oTable.Rows[i][1].ToString().Substring(0,17) ,headFont,Brushes.Black,180 ,18*(i+1)+50+k);

    string srows=oTable.Rows[i][1].ToString().Substring(18);
    g.DrawString(srows,headFont,Brushes.Black,180,18*(i+1)+65+k);
    k = 18*(i+1);
    }
    //可以畫完則不換行
    else
    {
    g.DrawString (oTable.Rows[i][1].ToString() ,headFont,Brushes.Black,180 ,lenth);
    k = 0;
    }
    //畫出其他的列
    g.DrawString (oTable.Rows[i][2].ToString() ,headFont,Brushes.Black,410 ,lenth,sFormat);
    g.DrawString (oTable.Rows[i][3].ToString() ,headFont,Brushes.Black,490 ,lenth,sFormat);
    g.DrawString (oTable.Rows[i][4].ToString() ,headFont,Brushes.Black,570 ,lenth,sFormat);
    //計算總量
    nTotal += double.Parse(oTable.Rows[i][4].ToString());
    //記每頁的記錄數 10條一頁
    i++;
    }
    string sRmb = x.SelectSingleNode("//START/PRINT_RMB").InnerText;
    string sTotal = x.SelectSingleNode("//START/PRINT_TOTAL").InnerText;
    g.DrawString(sTotal+nTotal.ToString()+sRmb,headFont,Brushes.Black,570,18*(10+1)+80+k,sFormat);                        
    //如果不是輸出到打印機則不要保存
    if(!FlagPrint)
    {
    //如果目錄不存在則建立
    if(!Directory.Exists("@Jpg"))
    {
    Directory.CreateDirectory("@Jpg");
    }
    //保存文件到Jpg目錄
    string sFileNme = "@Jpg\\"+nR.ToString()+".bmp";
    theImage.Save(sFileNme,ImageFormat.Bmp);
    //previous next button enable = true;
    tobtnPrevious.Enabled = true;
    tobtnNext.Enabled = true;
    }
    //回收資源
    theImage.Dispose();
    g.Dispose();
    }
    }
    //show total pages
    labTotal.Visible = true;
    labTotal.Text = "Total: "+ nRows.ToString() +"Pages";

    }
    catch(Exception Gerr)
    {
    MessageBox.Show(Gerr.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
    }
    }
    #endregion
      

  2.   

    to dunao([捐款給印尼的中國人就是犯賤]) :
    建议:
    一般不要用length来度量,你应该会发现其中的误差
    oTable.Rows[i][1].ToString().Length>17用MeasureString函数