求助,如何打印DataGridView里的内容??? 如题.怎么打印? 最好详细点,新手第一次做这样的课题... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 namespace XXX{ /// <summary> /// 实现DataGridView的打印 /// </summary> public class PrintDataGridView { private static List<DataGridViewCellPrint> CellPrintList = new List<DataGridViewCellPrint>(); private static int printRowCount = 0; private static bool IsPrint = true; private static bool IsRole = true; private static int PoXTmp = 0; private static int PoYTmp = 0; private static int WidthTmp = 0; private static int HeightTmp = 0; private static int RowIndex = 0; /// <summary> /// 打印DataGridView控件 /// </summary> /// <param name="dataGridView">DataGridView控件</param> /// <param name="includeColumnText">是否包括列标题</param> /// <param name="e">为 System.Drawing.Printing.PrintDocument.PrintPage 事件提供数据。</param> /// <param name="PoX">起始X坐标</param> /// <param name="PoY">起始Y坐标</param> public static void Print(DataGridView dataGridView, bool includeColumnText, PrintPageEventArgs e, ref int PoX, ref int PoY) { try { if (PrintDataGridView.IsPrint) { PrintDataGridView.printRowCount = 0; PrintDataGridView.IsPrint = false; PrintDataGridView.DataGridViewCellVsList(dataGridView, includeColumnText); if (0 == PrintDataGridView.CellPrintList.Count) return; if (PoX > e.MarginBounds.Left) PrintDataGridView.IsRole = true; else PrintDataGridView.IsRole = false; PrintDataGridView.PoXTmp = PoX; PrintDataGridView.PoYTmp = PoY; PrintDataGridView.RowIndex = 0; WidthTmp = 0; HeightTmp = 0; } if (0 != PrintDataGridView.printRowCount) { if (IsRole) { PoX = PoXTmp = e.MarginBounds.Left; PoY = PoYTmp = e.MarginBounds.Top; } else { PoX = PoXTmp; PoY = PoYTmp; } } while (PrintDataGridView.printRowCount < PrintDataGridView.CellPrintList.Count) { DataGridViewCellPrint CellPrint = CellPrintList[PrintDataGridView.printRowCount]; if (RowIndex == CellPrint.RowIndex) PoX = PoX + WidthTmp; else { PoX = PoXTmp; PoY = PoY + HeightTmp; if (PoY + HeightTmp > e.MarginBounds.Bottom) { HeightTmp = 0; e.HasMorePages = true; return; } } using (SolidBrush solidBrush = new SolidBrush(CellPrint.BackColor)) { RectangleF rectF1 = new RectangleF(PoX, PoY, CellPrint.Width, CellPrint.Height); e.Graphics.FillRectangle(solidBrush, rectF1); using (Pen pen = new Pen(Color.Black, 1)) e.Graphics.DrawRectangle(pen, Rectangle.Round(rectF1)); solidBrush.Color = CellPrint.ForeColor; e.Graphics.DrawString(CellPrint.FormattedValue, CellPrint.Font, solidBrush, new Point(PoX + 2, PoY + 3)); } WidthTmp = CellPrint.Width; HeightTmp = CellPrint.Height; RowIndex = CellPrint.RowIndex; PrintDataGridView.printRowCount++; } PoY = PoY + HeightTmp; e.HasMorePages = false; PrintDataGridView.IsPrint = true; } catch { e.HasMorePages = false; PrintDataGridView.IsPrint = true; throw; } } /// 将DataGridView控件内容转变到 CellPrintList /// </summary> /// <param name="dataGridView">DataGridView控件</param> /// <param name="includeColumnText">是否包括列标题</param> private static void DataGridViewCellVsList(DataGridView dataGridView, bool includeColumnText) { CellPrintList.Clear(); try { int rowsCount = dataGridView.Rows.Count; int colsCount = dataGridView.Columns.Count; //最后一行是供输入的行时,不用读数据。 if (dataGridView.Rows[rowsCount - 1].IsNewRow) rowsCount--; //包括列标题 if (includeColumnText) { for (int columnsIndex = 0; columnsIndex < colsCount; columnsIndex++) { if (dataGridView.Columns[columnsIndex].Visible) { DataGridViewCellPrint CellPrint = new DataGridViewCellPrint(); CellPrint.FormattedValue = dataGridView.Columns[columnsIndex].HeaderText; CellPrint.RowIndex = 0; CellPrint.ColumnIndex = columnsIndex; CellPrint.Font = dataGridView.Columns[columnsIndex].HeaderCell.Style.Font; CellPrint.BackColor = dataGridView.ColumnHeadersDefaultCellStyle.BackColor; CellPrint.ForeColor = dataGridView.ColumnHeadersDefaultCellStyle.ForeColor; CellPrint.Width = dataGridView.Columns[columnsIndex].Width; CellPrint.Height = dataGridView.ColumnHeadersHeight; CellPrintList.Add(CellPrint); } } } //读取单元格数据 for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++) { for (int columnsIndex = 0; columnsIndex < colsCount; columnsIndex++) { if (dataGridView.Columns[columnsIndex].Visible) { DataGridViewCellPrint CellPrint = new DataGridViewCellPrint(); CellPrint.FormattedValue = dataGridView.Rows[rowIndex].Cells[columnsIndex].FormattedValue.ToString(); if (includeColumnText) CellPrint.RowIndex = rowIndex + 1;//假如包括列标题则从行号1开始 else CellPrint.RowIndex = rowIndex; CellPrint.ColumnIndex = columnsIndex; CellPrint.Font = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.Font; System.Drawing.Color TmpColor = System.Drawing.Color.Empty; if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.BackColor) TmpColor = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.BackColor; else if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].DefaultCellStyle.BackColor) TmpColor = dataGridView.Rows[rowIndex].DefaultCellStyle.BackColor; else TmpColor = dataGridView.DefaultCellStyle.BackColor; CellPrint.BackColor = TmpColor; TmpColor = System.Drawing.Color.Empty; if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.ForeColor) TmpColor = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.ForeColor; else if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor) TmpColor = dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor; else TmpColor = dataGridView.DefaultCellStyle.ForeColor; CellPrint.ForeColor = TmpColor; CellPrint.Width = dataGridView.Columns[columnsIndex].Width; CellPrint.Height = dataGridView.Rows[rowIndex].Height; CellPrintList.Add(CellPrint); } } } } catch { throw; } } private class DataGridViewCellPrint { private string _FormattedValue = ""; private int _RowIndex = -1; private int _ColumnIndex = -1; private System.Drawing.Color _ForeColor = System.Drawing.Color.Black; private System.Drawing.Color _BackColor = System.Drawing.Color.White; private int _Width = 100; private int _Height = 23; private System.Drawing.Font _Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); /// <summary> /// 获取或设置单元格的字体。 /// </summary> public System.Drawing.Font Font { set { if (null != value) _Font = value; } get { return _Font; } } /// <summary> /// 获取为显示进行格式化的单元格的值。 /// </summary> public string FormattedValue { set { _FormattedValue = value; } get { return _FormattedValue; } } /// <summary> /// 获取或设置列的当前宽度 (以像素为单位)。默认值为 100。 /// </summary> public int Width { set { _Width = value; } get { return _Width; } } /// <summary> /// 获取或设置列标题行的高度(以像素为单位)。默认值为 23。 /// </summary> public int Height { set { _Height = value; } get { return _Height; } } /// <summary> /// 获取或设置行号。 /// </summary> public int RowIndex { set { _RowIndex = value; } get { return _RowIndex; } } /// <summary> /// 获取或设置列号。 /// </summary> public int ColumnIndex { set { _ColumnIndex = value; } get { return _ColumnIndex; } } /// <summary> /// 获取或设置前景色。 /// </summary> public System.Drawing.Color ForeColor { set { _ForeColor = value; } get { return _ForeColor; } } /// <summary> /// 获取或设置背景色。 /// </summary> public System.Drawing.Color BackColor { set { _BackColor = value; } get { return _BackColor; } } } } http://www.codeproject.com/推荐一个网站,可以在上面找到你想要的。。 定时备份时使用timer触发的疑问 vs上传组件放updatepanel里面就不起作用,怎么解决? 耗时计算。。。 无法获取父窗体,一直显示异常:未将对象引用设置到对象的实例。 怎么操作dojo控件TreeView的节点Node windows 服务 数据源绑定问题 面试题,分享 为什么OleDbCommand 里的SQL语句,不能含有LIMIT? 大家在项目中是如何处理关联查询返回结果的。 键盘事件怎么没反映 access表中有个字段类型是日期/时间,我现在要在程序中插入一条语句,那么在程序中这个字段我用啥类型?
/// <summary>
/// 实现DataGridView的打印
/// </summary>
public class PrintDataGridView
{
private static List<DataGridViewCellPrint> CellPrintList = new List<DataGridViewCellPrint>(); private static int printRowCount = 0; private static bool IsPrint = true;
private static bool IsRole = true;
private static int PoXTmp = 0;
private static int PoYTmp = 0;
private static int WidthTmp = 0;
private static int HeightTmp = 0;
private static int RowIndex = 0;
/// <summary>
/// 打印DataGridView控件
/// </summary>
/// <param name="dataGridView">DataGridView控件</param>
/// <param name="includeColumnText">是否包括列标题</param>
/// <param name="e">为 System.Drawing.Printing.PrintDocument.PrintPage 事件提供数据。</param>
/// <param name="PoX">起始X坐标</param>
/// <param name="PoY">起始Y坐标</param>
public static void Print(DataGridView dataGridView, bool includeColumnText, PrintPageEventArgs e, ref int PoX, ref int PoY)
{
try
{
if (PrintDataGridView.IsPrint)
{
PrintDataGridView.printRowCount = 0;
PrintDataGridView.IsPrint = false;
PrintDataGridView.DataGridViewCellVsList(dataGridView, includeColumnText);
if (0 == PrintDataGridView.CellPrintList.Count)
return;
if (PoX > e.MarginBounds.Left)
PrintDataGridView.IsRole = true;
else
PrintDataGridView.IsRole = false;
PrintDataGridView.PoXTmp = PoX;
PrintDataGridView.PoYTmp = PoY;
PrintDataGridView.RowIndex = 0;
WidthTmp = 0;
HeightTmp = 0;
}
if (0 != PrintDataGridView.printRowCount)
{
if (IsRole)
{
PoX = PoXTmp = e.MarginBounds.Left;
PoY = PoYTmp = e.MarginBounds.Top;
}
else
{
PoX = PoXTmp;
PoY = PoYTmp;
}
}
while (PrintDataGridView.printRowCount < PrintDataGridView.CellPrintList.Count)
{
DataGridViewCellPrint CellPrint = CellPrintList[PrintDataGridView.printRowCount];
if (RowIndex == CellPrint.RowIndex)
PoX = PoX + WidthTmp;
else
{
PoX = PoXTmp;
PoY = PoY + HeightTmp;
if (PoY + HeightTmp > e.MarginBounds.Bottom)
{
HeightTmp = 0;
e.HasMorePages = true;
return;
}
}
using (SolidBrush solidBrush = new SolidBrush(CellPrint.BackColor))
{
RectangleF rectF1 = new RectangleF(PoX, PoY, CellPrint.Width, CellPrint.Height);
e.Graphics.FillRectangle(solidBrush, rectF1);
using (Pen pen = new Pen(Color.Black, 1))
e.Graphics.DrawRectangle(pen, Rectangle.Round(rectF1));
solidBrush.Color = CellPrint.ForeColor;
e.Graphics.DrawString(CellPrint.FormattedValue, CellPrint.Font, solidBrush, new Point(PoX + 2, PoY + 3));
}
WidthTmp = CellPrint.Width;
HeightTmp = CellPrint.Height;
RowIndex = CellPrint.RowIndex;
PrintDataGridView.printRowCount++;
}
PoY = PoY + HeightTmp;
e.HasMorePages = false;
PrintDataGridView.IsPrint = true;
}
catch
{
e.HasMorePages = false;
PrintDataGridView.IsPrint = true;
throw;
}
}
/// </summary>
/// <param name="dataGridView">DataGridView控件</param>
/// <param name="includeColumnText">是否包括列标题</param>
private static void DataGridViewCellVsList(DataGridView dataGridView, bool includeColumnText)
{
CellPrintList.Clear();
try
{
int rowsCount = dataGridView.Rows.Count;
int colsCount = dataGridView.Columns.Count; //最后一行是供输入的行时,不用读数据。
if (dataGridView.Rows[rowsCount - 1].IsNewRow)
rowsCount--;
//包括列标题
if (includeColumnText)
{
for (int columnsIndex = 0; columnsIndex < colsCount; columnsIndex++)
{
if (dataGridView.Columns[columnsIndex].Visible)
{
DataGridViewCellPrint CellPrint = new DataGridViewCellPrint();
CellPrint.FormattedValue = dataGridView.Columns[columnsIndex].HeaderText;
CellPrint.RowIndex = 0;
CellPrint.ColumnIndex = columnsIndex;
CellPrint.Font = dataGridView.Columns[columnsIndex].HeaderCell.Style.Font;
CellPrint.BackColor = dataGridView.ColumnHeadersDefaultCellStyle.BackColor;
CellPrint.ForeColor = dataGridView.ColumnHeadersDefaultCellStyle.ForeColor;
CellPrint.Width = dataGridView.Columns[columnsIndex].Width;
CellPrint.Height = dataGridView.ColumnHeadersHeight;
CellPrintList.Add(CellPrint);
}
}
}
//读取单元格数据
for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++)
{
for (int columnsIndex = 0; columnsIndex < colsCount; columnsIndex++)
{
if (dataGridView.Columns[columnsIndex].Visible)
{
DataGridViewCellPrint CellPrint = new DataGridViewCellPrint();
CellPrint.FormattedValue = dataGridView.Rows[rowIndex].Cells[columnsIndex].FormattedValue.ToString();
if (includeColumnText)
CellPrint.RowIndex = rowIndex + 1;//假如包括列标题则从行号1开始
else
CellPrint.RowIndex = rowIndex;
CellPrint.ColumnIndex = columnsIndex;
CellPrint.Font = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.Font;
System.Drawing.Color TmpColor = System.Drawing.Color.Empty;
if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.BackColor)
TmpColor = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.BackColor;
else if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].DefaultCellStyle.BackColor)
TmpColor = dataGridView.Rows[rowIndex].DefaultCellStyle.BackColor;
else
TmpColor = dataGridView.DefaultCellStyle.BackColor;
CellPrint.BackColor = TmpColor;
TmpColor = System.Drawing.Color.Empty;
if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.ForeColor)
TmpColor = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.ForeColor;
else if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor)
TmpColor = dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor;
else
TmpColor = dataGridView.DefaultCellStyle.ForeColor;
CellPrint.ForeColor = TmpColor;
CellPrint.Width = dataGridView.Columns[columnsIndex].Width;
CellPrint.Height = dataGridView.Rows[rowIndex].Height;
CellPrintList.Add(CellPrint);
}
}
}
}
catch { throw; }
} private class DataGridViewCellPrint
{
private string _FormattedValue = "";
private int _RowIndex = -1;
private int _ColumnIndex = -1;
private System.Drawing.Color _ForeColor = System.Drawing.Color.Black;
private System.Drawing.Color _BackColor = System.Drawing.Color.White;
private int _Width = 100;
private int _Height = 23;
private System.Drawing.Font _Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
/// <summary>
/// 获取或设置单元格的字体。
/// </summary>
public System.Drawing.Font Font
{
set { if (null != value) _Font = value; }
get { return _Font; }
}
/// <summary>
/// 获取为显示进行格式化的单元格的值。
/// </summary>
public string FormattedValue
{
set { _FormattedValue = value; }
get { return _FormattedValue; }
}
/// <summary>
/// 获取或设置列的当前宽度 (以像素为单位)。默认值为 100。
/// </summary>
public int Width
{
set { _Width = value; }
get { return _Width; }
}
/// <summary>
/// 获取或设置列标题行的高度(以像素为单位)。默认值为 23。
/// </summary>
public int Height
{
set { _Height = value; }
get { return _Height; }
}
/// <summary>
/// 获取或设置行号。
/// </summary>
public int RowIndex
{
set { _RowIndex = value; }
get { return _RowIndex; }
}
/// <summary>
/// 获取或设置列号。
/// </summary>
public int ColumnIndex
{
set { _ColumnIndex = value; }
get { return _ColumnIndex; }
}
/// <summary>
/// 获取或设置前景色。
/// </summary>
public System.Drawing.Color ForeColor
{
set { _ForeColor = value; }
get { return _ForeColor; }
}
/// <summary>
/// 获取或设置背景色。
/// </summary>
public System.Drawing.Color BackColor
{
set { _BackColor = value; }
get { return _BackColor; }
} } }
推荐一个网站,可以在上面找到你想要的。。