/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPreview_Click(object sender, EventArgs e)
{
       PackTypeReport report = null;
_printTable = GetPrintTable();
report.PrintData = _printTable;
report.Preview();
} /// <summary>
/// 打印
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPrint_Click(object sender, EventArgs e)
{
PackTypeReport report = null;
_printTable = GetPrintTable();
report.PrintData = _printTable;
report.Print();
}
 /// <summary>
/// 电子条码打印
/// </summary>
public class PackTypeReport
{ /// <summary>
/// 打印文档
/// </summary>
PrintDocument _printDoc;
/// <summary>
/// 打印预览窗体
/// </summary>
PrintPreviewDialog _printPreview; /// <summary>
/// A4纸宽度
/// </summary>
const float PageWidth = 840f;//210mm
/// <summary>
/// A4纸高度
/// </summary>
const float PageHeight = 1188f;//297mm const float PaddingVertical = 20f;//上下边距
const float PaddingHorizontal = 40f;//左右边距
const float BarCodeHeight = ;//条码高度
const float ItemPadding = ;//项目内部项上下间隔
private float BarCodeTop = PaddingVertical;
private float _barcodeLeft = PaddingHorizontal;
private float _barcodeWidth = ;//每个条码的间隔量
private float _ItemHeight = ;//每个项目间的上下间隔
private float CodeNameTHeight = 0f;//条码(包括下边距)和包名总高度,窗体加载中设置
private int PageIndex = ;//打印当前页
private string Title = "器械包编码";//打印显示的标题;
private DataRow[] printRowsForC = null;//字母检索数据行集合
private Font TitleFont = new Font("Arital", 16f, FontStyle.Bold);//标题字体
private Font CodeFont = new Font("Arital", 10f);//条码字体
private Font NameFont = new Font("Arital", 12f);//包名字体
private char letter = '';//非字母标实
private int rowIndex = ;//行索引
private List<DataRow> printRowsForD = null;//非字母检索数据行集合 private DataTable _printTable = null;
/// <summary>
/// 打印数据
/// </summary>
public DataTable PrintData
{
set
{
_printTable = value;
}
}
/// <summary>
///
/// </summary>
public PackTypeReport(PrintDocument pd, PrintPreviewDialog prd)
{
_printDoc = pd;
_printPreview = prd;
CodeNameTHeight = GetCodeAndNameHeight(); _printPreview.Width = ;
_printPreview.Height = ;
_printDoc.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(, , , );
_printDoc.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("A4", (int)PageWidth, (int)PageHeight);
_printDoc.PrintPage += new PrintPageEventHandler(DrawPage);
} /// <summary>
/// 打印
/// </summary>
public void Print()
{
_printDoc.Print();
} /// <summary>
/// 预览
/// </summary>
public void Preview()
{
_printPreview.ShowDialog();
} //条码(包括下边距)和包名总高度
private float GetCodeAndNameHeight()
{
return TitleFont.GetHeight() + ItemPadding + BarCodeHeight;
} /// <summary>
/// 开始绘制
/// </summary>
private void DrawPage(object sender,System.Drawing.Printing.PrintPageEventArgs e)
{
//定位到页头
BarCodeTop = PaddingVertical;
//临时的下一个定位点,用于绘制包名条码
float LSTop = 0f;
//第一页需要绘制标题
if (PageIndex == )
{
DrawTitle(e.Graphics, Title, ref BarCodeTop);
}
float y = ;
while (BarCodeTop < PageHeight - PaddingVertical)
{
if (letter == '')
{
//检索非字母优化设置
if (printRowsForD == null)
{
printRowsForD = new List<DataRow>();
foreach (DataRow dr in _printTable.Select("", "name asc"))
{
if (dr["Spell"].ToString() == "" || !char.IsLetter(dr["Spell"].ToString()[]))
{
printRowsForD.Add(dr);
}
}
//0个非字母数据时,将转入字母A开始的数据,并初始化行索引rowIndex
if (printRowsForD.Count == )
{
letter = 'A';
rowIndex = ;
}
}
else
{
//行索引在指定行内
if (rowIndex < printRowsForD.Count)
{
string packName = printRowsForD[rowIndex]["Name"].ToString();
string barcode = printRowsForD[rowIndex]["Bar"].ToString();
if (rowIndex % == )
{
//判断包名和条码组合高度是否超出指定高度
_barcodeLeft = PaddingHorizontal;
BarCodeTop += y + _ItemHeight;//加上Y偏移
if (BarCodeTop + CodeNameTHeight >= PageHeight - PaddingVertical)
{
break;
}
else
{
y = DrawCodeAndName(e.Graphics, packName, barcode,letter, _barcodeLeft, BarCodeTop);
LSTop = y + BarCodeTop + ;
}
}
else
{
y = DrawCodeAndName(e.Graphics, packName, barcode, '',_barcodeLeft, BarCodeTop);
}
_barcodeLeft += _barcodeWidth;
rowIndex++;
}
else
{
//数据全部加载完设置
printRowsForD = null;
letter = 'A'; //奇偶条码终点定位设置,奇数需要跳转到下一个定位点高度
if ((rowIndex - ) % == )
{
BarCodeTop = LSTop;
y = ;//Y偏移量已经加在LSTOP上
} rowIndex = ;
//类型名与条码包名的组合高度超过指定高度,需要跳转到下一页,用于分类名显示不会显示在页尾的情况
if (BarCodeTop + CodeNameTHeight >= PageHeight - PaddingVertical)
{
break;
}
}
}
}
else
{
//字母检索优化设置
if (printRowsForC == null || printRowsForC.Length == )
{
//判断当前定位点是否能够包含类型名绘制点
if (BarCodeTop >= PageHeight - PaddingVertical)
{
break;
}
else
{
printRowsForC = _printTable.Select(string.Format("Spell like '{0}%'", letter), "Name asc");
//判断该分类数据是否存在,存在时显示其分类名
if (printRowsForC.Length == )
{//如果该分类不存在数据,且不是Z字母时,初始化行索引和进入下一个字母,若为Z,初始化后退出循环
if (letter < 'Z')
{
rowIndex = ;
letter = (char)(letter + );
}
else
{
rowIndex = ;
letter = (char)(letter + );
printRowsForC = null;
break;
}
}
}
}
else
{
//行索引在指定行内
if (rowIndex < printRowsForC.Length)
{
string packName = printRowsForC[rowIndex]["Name"].ToString();
string barcode = printRowsForC[rowIndex]["Bar"].ToString();
if (rowIndex % == )
{
BarCodeTop += y + _ItemHeight;
_barcodeLeft = PaddingHorizontal;
//判断包名和条码组合高度是否超出指定高度
if (BarCodeTop + CodeNameTHeight >= PageHeight - PaddingVertical)
{
break;
}
else
{
y = DrawCodeAndName(e.Graphics, packName, barcode, letter, _barcodeLeft, BarCodeTop);
LSTop = y + BarCodeTop + ;
} }
else
{
y = DrawCodeAndName(e.Graphics, packName, barcode, '', _barcodeLeft, BarCodeTop);
}
_barcodeLeft += _barcodeWidth;
rowIndex++;
}
else
{
//加载该字母分类数据完毕时,需要判断该字母是否为字母Z。若不是,进入奇偶条码的下一个定位点判断,并初始化。若是,则设置字符为Z的下一个,并退出循环
if (letter >= 'Z')
{
letter = (char)(letter + );
break;
}
else if ((rowIndex - ) % == )
{
BarCodeTop = LSTop;
y = ;
}
rowIndex = ;
printRowsForC = null;
letter = (char)(letter + );
//类型名与条码包名的组合高度超过指定高度,需要跳转到下一页,用于分类名显示不会显示在页尾的情况
if (BarCodeTop + CodeNameTHeight >= PageHeight - PaddingVertical)
{
break;
}
}
}
}
} PageIndex++;
//当退出循环时,使用字符判断是否为Z的下一个字符,来确定当前页是否是最后一页
if (letter <= 'Z')
{
e.HasMorePages = true;
}
else
{
PageIndex = ;
letter = '';
rowIndex = ;
printRowsForD = null;
printRowsForC = null;
e.HasMorePages = false;
}
} /// <summary>
/// 绘制标题
/// </summary>
private void DrawTitle(Graphics g, string strTitle, ref float y)
{
float width = g.MeasureString(strTitle, TitleFont).Width;
float left = (PageWidth - width) / ;
g.DrawString(strTitle, TitleFont, Brushes.Black, left, PaddingHorizontal); y += TitleFont.GetHeight() + ItemPadding;
} /// <summary>
/// 绘制条码和包名,返回下边纵坐标
/// </summary>
/// <returns>float</returns>
private float DrawCodeAndName(Graphics g, string name, string code,char letter, float x, float y)
{
float top = ;
float y1 = ;
string name1 = string.Empty;
string name2 = string.Empty; if (name.Length > )
{
name1 = name.Substring(, );
name2 = name.Substring();
}
else
{
name2 = " ";
name1 = name;
}
if (letter != '')
{
g.DrawString(Convert.ToString(letter), NameFont, Brushes.Black, x, y);
y1 = NameFont.GetHeight() + ItemPadding;
top = y1;
y += y1;
}
else
{
g.DrawString("", NameFont, Brushes.Black, x, y);
y1 = NameFont.GetHeight() + ItemPadding;
top = y1;
y += y1;
}
g.DrawString(name1, NameFont, Brushes.Black, x, y);
y1 = NameFont.GetHeight() + ItemPadding;
top = y1;
y += y1; g.DrawString(name2, NameFont, Brushes.Black, x, y);
top += y1;
y += y1; float y2 = ;
g.DrawString(code, CodeFont, Brushes.Black, x, y);
y2 = CodeFont.GetHeight() + ItemPadding; top += y2;
y += y2;
Image codeImg = BLL.Report.Print.IReport.GetBarcodeImg(code);
g.DrawImage(codeImg, x, y); top += codeImg.Height + ItemPadding; return top;
} }

最新文章

  1. Error LNK1104 cannot open file &#39;libboost_system-vc140-mt-gd-1_58.lib&#39;
  2. Unity3D NGUI动态生成模糊背景图
  3. git入门学习
  4. 【Eclipse】修改 编码格式
  5. jstl &lt;c:forEach&gt; 介绍
  6. CCF 201612-1 最大波动 (水题)
  7. Cocoa编程开发者手册
  8. zepto源码--$.map,$.each,$.grep--学习笔记
  9. phalcon: (非官方)简单的多模块
  10. 在Hudson Job中启动daemon进程
  11. SNMP支持IPv6
  12. CF1146 Forethought Future Cup Elimination Round Tutorial
  13. MSSQL 转 ACCESS 在表格结构上应注意的
  14. java.net.ServerSocket 解析
  15. Okhttp之CallServerInterceptor简单分析
  16. Go语言学习笔记(4)——数组和切片
  17. razor使用注意点........
  18. Linux基础实验(二)
  19. Install Java JDK JRE on Ubuntu/Debian with Apt-Get
  20. Python 遍历dict

热门文章

  1. mysql事务隔离级别测试
  2. 使用CMake生成sln项目和VS工程遇到的问题
  3. java显示网格————————
  4. Java-Maven-Runoob:Maven POM
  5. 实例甜点 Unreal Engine 4迷你教程(3)之用C++改变Image小部件的其它属性
  6. PHP定时任务Crontab结合CLI模式详解
  7. Python Twisted系列教程7:小插曲,Deferred
  8. 聚类 高维聚类 聚类评估标准 EM模型聚类
  9. DIKW模型与数据工程
  10. IIS监控应用程序池和站点假死,自动重启IIS小工具