前些天做了一个项目,其中遇到了一个打印的问题。问题的大概描述如下:
在项目中,用户查询到的信息在ListView中进行显示,同时,在必要的情况下对信息进行打印。我想过使用水晶报表,但是,时间原因没有去做,因为那样的做法要做的工作比较多。所以想到了直接对ListView进行打印。
解决方案:在网上查了很多资料,发现长江支流的打印做的比较不错,下面就介绍一下他的源码构成。
2,MisGoldPrinter.cs文件
以上的文件和文件夹是关键所在,同时,需要添加MisGoldPrinter.dll的引用。这样,所要准备的工作就已经做完了,剩下的就是针对自己的项目进行相应的修改了。
我的项目修改:
GoldPrinter.MisGoldPrinter misGoldPrinter = new GoldPrinter.MisGoldPrinter(true);
private void Print(bool p_PrintOrPreview)
{
//*****第二步*****:直接赋值给打印对象(可选)
misGoldPrinter.Title = "XXXXXXXXXXXX"; //主标题
misGoldPrinter.Caption = " ——商品订单统计表"; //副标题
misGoldPrinter.Top = "作者:XXXXXXXXXXXXXXXXX"; //抬头,一行三列的文字说明,用|分隔
misGoldPrinter.Bottom = "打印程序||打印日期:" + System.DateTime.Now.ToLongDateString(); //结尾,说明同抬头
//*****第三步*****:打印重点,设置数据源
//可以是一维数组、二维数组、DataGrid、DataTable、ListView、MshFlexGrid、HtmlTable...,
//总之,不支持的你自己写一个函数转换成二维数组赋给DataSource一切搞定
misGoldPrinter.DataSource = ToStringArray(lisShow, true); //DataGrid作为数据源
//打印的核心是Body,可以对它设置字体、列宽等等
((GoldPrinter.Body)(misGoldPrinter.Body)).IsAverageColsWidth = false;//指明平均列宽
//*****第四步*****:打印或预览
if (p_PrintOrPreview)
{
misGoldPrinter.Print(); //打印
}
else
{
misGoldPrinter.Preview(); //预览
}
}
public string[,] ToStringArray(ListView listView, bool includeColumnText)
{
ListView lvw = listView;
int rowsCount = lvw.Items.Count;
int colsCount = lvw.Columns.Count;
//包括列标题
if (includeColumnText)
{
rowsCount++;
}
string[,] arrReturn = null;
arrReturn = new string[rowsCount, colsCount];
int i = 0;
if (includeColumnText)
{
//写标题
for (i = 0; i < colsCount; i++)
{
arrReturn[0, i] = lvw.Columns[i].Text;
}
i = 1;
}
//写数据行Items
int rowIndex = 0;
for (; i < rowsCount; i++, rowIndex++)
{
for (int j = 0; j < colsCount; j++)
{
arrReturn[i, j] = lvw.Items[rowIndex].SubItems[j].Text;
}
}
return arrReturn;
}
接下来的需求就是如何打印只定的列了,而不是全部打印了。
修改如下,一看就会明白的:
arrReturn = new string[rowsCount, 11];//指定宽度,而不是整个的宽度
int i = 0;
if (includeColumnText)
{
//写标题
arrReturn[0, 0] = lvw.Columns[0].Text;
arrReturn[0, 1] = lvw.Columns[2].Text;
arrReturn[0, 2] = lvw.Columns[3].Text;
arrReturn[0, 3] = lvw.Columns[6].Text;
arrReturn[0, 4] = lvw.Columns[5].Text;
arrReturn[0, 5] = lvw.Columns[7].Text;
arrReturn[0, 6] = lvw.Columns[8].Text;
arrReturn[0, 7] = lvw.Columns[9].Text;
arrReturn[0, 8] = "总金额(元)";
arrReturn[0, 9] = lvw.Columns[15].Text;
arrReturn[0, 10] = lvw.Columns[16].Text;
//for (i = 0; i < colsCount; i++)
//{
// arrReturn[0, i] = lvw.Columns[i].Text;
//}
//i = 1;
}
//写数据行Items
for (int j = 1, m =0; j < rowsCount; j++,m++)
{
arrReturn[j, 0] = lvw.Items[m].SubItems[0].Text;
arrReturn[j, 1] = lvw.Items[m].SubItems[2].Text;
arrReturn[j, 2] = lvw.Items[m].SubItems[3].Text;
arrReturn[j, 3] = lvw.Items[m].SubItems[6].Text;
arrReturn[j, 4] = lvw.Items[m].SubItems[5].Text;
arrReturn[j, 5] = lvw.Items[m].SubItems[7].Text;
arrReturn[j, 6] = lvw.Items[m].SubItems[8].Text;
arrReturn[j, 7] = lvw.Items[m].SubItems[9].Text;
int sum= int.Parse(arrReturn[j, 5]) * int.Parse(arrReturn[j, 6]);
arrReturn[j, 8] = sum.ToString();
arrReturn[j, 9] = lvw.Items[m].SubItems[15].Text;
arrReturn[j, 10] = lvw.Items[m].SubItems[16].Text;
}
这样,基本上就可以了。如果有更好的使用方法,希望大家留言!!