对listView和DataGridView中内容的打印问题

 前些天做了一个项目,其中遇到了一个打印的问题。问题的大概描述如下:

     在项目中,用户查询到的信息在ListView中进行显示,同时,在必要的情况下对信息进行打印。我想过使用水晶报表,但是,时间原因没有去做,因为那样的做法要做的工作比较多。所以想到了直接对ListView进行打印。

     解决方案:在网上查了很多资料,发现长江支流的打印做的比较不错,下面就介绍一下他的源码构成。

     1,Sysobject文件夹:

     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;

                }
          这样,基本上就可以了。如果有更好的使用方法,希望大家留言!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值