关于打印的小问题,达人乱入 仅供参考:http://blog.csdn.net/landlordh/archive/2004/11/23/192119.aspx 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 以前寫的希望對你有用!寫的不好多多見諒//打印 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 to dunao([捐款給印尼的中國人就是犯賤]) :建议:一般不要用length来度量,你应该会发现其中的误差oTable.Rows[i][1].ToString().Length>17用MeasureString函数 OutLookBar 控件 右键问题 反射创建类实例 VS2008加载项目时出现输入的字符串格式不正确的错误 C#winform开发 javascript如何得到页面参数传递值 C/S模式C#程序和B/S模式C#程序程序如何相互传值 时间相加 C#: 如何取得系统 日期格式? StreamWriter 的问题谢谢大家 有一个比较菜的问题,请大侠们帮忙 c#写的程序可以在没有装.net框架的系统上运行吗? base64编码问题 急,问个有关三层结构的问题 在线等
//打印
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
建议:
一般不要用length来度量,你应该会发现其中的误差
oTable.Rows[i][1].ToString().Length>17用MeasureString函数