关于可分页的DataGridView的打印还没又改好,现在还是处于未分页的状态,先写上来吧。
首先看效果图:
http://s3/mw690/621e24e2tx6CIEr8qtA02&690DataGridView数据打印(带标题、页码、居中显示、自调宽度)" TITLE="C# DataGridView数据打印(带标题、页码、居中显示、自调宽度)" />
http://s3/mw690/621e24e2tx6CIErcqNYd2&690DataGridView数据打印(带标题、页码、居中显示、自调宽度)" TITLE="C# DataGridView数据打印(带标题、页码、居中显示、自调宽度)" />
http://s13/mw690/621e24e2tx6CIErgu1mfc&690DataGridView数据打印(带标题、页码、居中显示、自调宽度)" TITLE="C# DataGridView数据打印(带标题、页码、居中显示、自调宽度)" />
DataGridViewPrint类尤为重要,核心就是利用GDI一个单元格一个单元格去绘制,包括标题、页码都是如此。
这里有必要说一下,代码会吧表格紧紧凑凑的绘制出来,但是如果表格宽度太大,就会超出你的PageWidth-LeftMargin-RightMargin,这样的话,就打印不全了,到现在为止我只想出了三个办法:一、就是打印方向由纵向改变成横向;二、在纸张来源选择宽度大的纸;三、动态把不需要打印出来的列给隐藏了,只打出有用的数据。如果这样也没办法,那就只有修改字号了。
尤为重要的是,我把代码里面的Margin值都写死了,而不是printDocument.DefaultPageSettings.Margins,原因就在于默认的Margin会空出大量的空白,数据列多的时候,空白难道不利用起来?记住,以A4纸为例,默认宽度827,长度1169,其中Landscape的值false为纵向,true为横向,不管打印方向是纵向还是横向,注意了,PaperSize.Width始终是827,PaperSize.Height始终是1169。
其他应该没什么了,都是知道与不知道的问题,比较乱的是坐标啊、高度啊、宽度啊这些循环操作,不过细心点也没什么。
再放几张简图,有需要做更细致的功能的朋友,可以看一下,我也是从网上找的:
http://s16/mw690/621e24e2tcc1516cbcd3f&690DataGridView数据打印(带标题、页码、居中显示、自调宽度)" TITLE="C# DataGridView数据打印(带标题、页码、居中显示、自调宽度)" />
http://s15/mw690/621e24e2tcc1516c9ef7e&690DataGridView数据打印(带标题、页码、居中显示、自调宽度)" TITLE="C# DataGridView数据打印(带标题、页码、居中显示、自调宽度)" />
最后看一下项目代码吧,窗体就只有一个gridView1、printDocument1、button1和button2,具体什么意思直接看代码就完了,挺简单的,直接上窗体的图:
http://s16/mw690/621e24e2tcc152045a5ef&690DataGridView数据打印(带标题、页码、居中显示、自调宽度)" TITLE="C# DataGridView数据打印(带标题、页码、居中显示、自调宽度)" />
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public
partial class Form1 : Form
{
DataGridViewPrint dataGridViewPrint;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("1", typeof(string));
dt.Columns.Add("2", typeof(string));
dt.Columns.Add("3", typeof(string));
dt.Columns.Add("4", typeof(string));
dt.Columns.Add("5", typeof(string));
dt.Columns.Add("6", typeof(string));
dt.Columns.Add("7", typeof(string));
for (int i = 0; i < 5; i++)
{
DataRow dr = dt.NewRow();
for (int j = 0; j < 7; j++)
{
dr[j] = "本单元格数据:" + Convert.ToString(j + 1);
}
dt.Rows.Add(dr);
}
this.dataGridView1.DataSource = dt;
}
private void button1_Click(object sender, EventArgs e)
{
//显示页面设置对话框
PageSetupDialog MyDlg = new PageSetupDialog();
MyDlg.Document = this.printDocument1;
MyDlg.ShowDialog();
}
private void button2_Click(object sender, EventArgs e)
{
//显示打印对话框
PrintDialog MyDlg = new PrintDialog();
MyDlg.Document = this.printDocument1;
if (MyDlg.ShowDialog().Equals(DialogResult.OK))
{
//显示打印预览对话框
dataGridViewPrint = new DataGridViewPrint(dataGridView1,
printDocument1, true, true, "数据报表", new
System.Drawing.Font("Tahoma", 18, FontStyle.Bold,
GraphicsUnit.Point), Color.Black, true);
PrintPreviewDialog a = new PrintPreviewDialog();
a.Document = this.printDocument1;
a.ShowDialog();
}
}
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
//true表示还有数据行没有打印完,则继续打
if (dataGridViewPrint.DrawDataGridView(e.Graphics))
{
//附加打印页
e.HasMorePages = true;
}
else
{
DataGridViewPrint.PageNumber = 0;
DataGridViewPrint.mColumnPoints.Clear();
DataGridViewPrint.mColumPointsWidth.Clear();
}
}
}
}
DataGridViewPrint类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public class
DataGridViewPrint
{
//要打印的gridview
private DataGridView TheDataGridView;
//要传给打印机的文件
private PrintDocument ThePrintDocument;
//是否居中
private bool IsCenterOnPage;
//是否还有标题
private bool IsWithTitle;
//是否
private bool IsWithPaging;
//标题名称
private string TheTitleText;
//标题字体
private Font TheTitleFont;
//标题颜色
private Color TheTitleColor;
//当前的行数
static int CurrentRow = 0;
//页数
public static int PageNumber = 0;
//纸张的宽度
private int PageWidth;
//纸张的长度
private int PageHeight;
//左间距
private int LeftMargin;
//顶间距
private int TopMatgin;
//右间距
private int RightMargin;
//底间距
private int BottomMargin;
private float CurrentY;
//列头的高度
private float RowHeaderHeight;
//每行的高度
private List RowsHeight;
//每列的宽度
private List ColumnsWidth;
//整个表格的宽度
private float TheDataGridViewWidth;
public static List mColumnPoints;
public static List mColumPointsWidth;
public static int mColumnPoint;
#region 有参构造函数
///
/// 有参构造函数
///
/// 要打印的DataGridView
/// 要传给打印机的打印文件
/// 是否居中
/// 是否包含标题
/// 标题名称
/// 标题文本格式
/// 标题的颜色
///
public DataGridViewPrint(DataGridView theDataGridView,
PrintDocument thePrintDocument, bool isCennterOnPage, bool
isWithTitle, string theTitleText, Font theTitleFont, Color
theTitleColor, bool isWithPaing)
{
TheDataGridView = theDataGridView;
ThePrintDocument = thePrintDocument;
IsCenterOnPage = isCennterOnPage;
IsWithTitle = isWithTitle;
IsWithPaging = isWithPaing;
TheTitleText = theTitleText;
TheTitleFont = theTitleFont;
TheTitleColor = theTitleColor;
IsWithPaging = isWithPaing;
RowsHeight = new List();
ColumnsWidth = new List();
mColumnPoints = new List();
mColumPointsWidth = new List();
//根据用户所选纸张纵向还是横向来获得纸张的高度和宽度
if (!ThePrintDocument.DefaultPageSettings.Landscape)
{
//纵向
PageWidth =
ThePrintDocument.DefaultPageSettings.PaperSize.Width;
PageHeight =
ThePrintDocument.DefaultPageSettings.PaperSize.Height;
LeftMargin = 10;
RightMargin = 10;
TopMatgin = 20;
BottomMargin = 20;
}
else
{
//横向
PageWidth =
ThePrintDocument.DefaultPageSettings.PaperSize.Height;
PageHeight =
ThePrintDocument.DefaultPageSettings.PaperSize.Width;
LeftMargin = 20;
RightMargin = 20;