DataGrid 打印类 V1.0b






4.16/5 (19投票s)
2004年9月20日

278858

2567
一个 DataGrid 打印类。
UML 设计
预览
引言
DataGrid
控制是使用起来最糟糕的控件之一,但又非常需要。这个控件的真正问题在于打印网格。这个类支持从右到左的打印、彩色和对齐的网格打印...
背景
我需要做一个支持从右到左网格打印的项目,但我找到的所有打印类都无法胜任。所以,我创建了一个新的...
实现
主类是 PrinterClass
,它执行实际的打印。Grid
是一个保存 DataGrid
数据的类,它由单元格和标题组成。Cell
代表网格中的单个单元格,包含位置、字体对齐等。Header
代表单个标题单元格(继承自 Cell
)。
使用代码
网格创建
public Grid(DataGrid TheGrid)
{
try
{
//get the Data in the grid
DataTable TableGrid = (DataTable)TheGrid.DataSource;
//set number of rows
rows = TableGrid.Rows.Count;
//set number of columns
//first check if the grid has tablestyle and columnstyle
CreateColumnStyles(TheGrid,TableGrid);
if (TheGrid.TableStyles[TableGrid.TableName].GridColumnStyles.Count>0)
columns =
TheGrid.TableStyles[TableGrid.TableName].GridColumnStyles.Count;
//init number of columns to headers
Headers = new Header[Columns];
SetHeaders(TheGrid,TableGrid);
Cells = new Cell[Rows,Columns];
//Copy Cells
for (int i=0;i<Rows;i++)
{
for (int j=0;j<Columns;j++)
{
Cells[i,j] = new Cell(i, j, TheGrid.Font,
TheGrid.GetCellBounds(i,j), TheGrid[i,j].ToString());
}
}
//define grid colors
SetColors(TheGrid);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
网格打印
private void PrintDataGrid(Graphics g)
{
StringFormat sf = new StringFormat();
//if we want to print the grid right to left
if (bRightToLeft)
{
CurrentX = PrintDoc.DefaultPageSettings.PaperSize.Width -
PrintDoc.DefaultPageSettings.Margins.Right;
sf.FormatFlags = StringFormatFlags.DirectionRightToLeft;
}
else
{
CurrentX = PrintDoc.DefaultPageSettings.Margins.Left;
}
for (int i=0;i<PrintGrid.Rows;i++)
{
for (int j=0;j<PrintGrid.Columns;j++)
{
//set cell alignment
switch (PrintGrid[i,j].Alignment)
{
//left
case HorizontalAlignment.Left:
sf.Alignment = StringAlignment.Near;
break;
//center
case HorizontalAlignment.Center:
sf.Alignment = StringAlignment.Center;
break;
//right
case HorizontalAlignment.Right:
sf.Alignment = StringAlignment.Far;
break;
}
//advance X according to order
if (bRightToLeft)
{
//draw the cell bounds (lines)
g.DrawRectangle(Pens.Black,CurrentX - PrintGrid[i,j].Width,
CurrentY,PrintGrid[i,j].Width,PrintGrid[i,j].Height);
//draw the cell text
g.DrawString(PrintGrid[i,j].Text,
PrintGrid[i,j].Font,Brushes.Black,
new RectangleF(CurrentX - PrintGrid[i,j].Width,
CurrentY, PrintGrid[i,j].Width,
PrintGrid[i,j].Height),sf);
//next cell
CurrentX -=PrintGrid[i,j].Width;
}
else
{
//draw the cell bounds (lines)
g.DrawRectangle(Pens.Black ,CurrentX,CurrentY,
PrintGrid[i,j].Width,PrintGrid[i,j].Height);
//draw the cell text
//Draw text by alignment
g.DrawString(PrintGrid[i,j].Text,PrintGrid[i,j].Font,
Brushes.Black, new RectangleF(CurrentX,CurrentY,
PrintGrid[i,j].Width,PrintGrid[i,j].Height),sf);
//next cell
CurrentX +=PrintGrid[i,j].Width;
}
}
//reset to beginning
if (bRightToLeft)
{
//right align
CurrentX = PrintDoc.DefaultPageSettings.PaperSize.Width -
PrintDoc.DefaultPageSettings.Margins.Right;
}
else
{
//left align
CurrentX = PrintDoc.DefaultPageSettings.Margins.Left;
}
//advance to next row
CurrentY = CurrentY + PrintGrid[i,0].Height;
}
}
当前待办事项
- 修复 - 当网格为空时,标题打印不正确。
- 当网格大于页面的
WIDTH
时,继续到下一页。