二、制表
本节主要讲解如何绘制报表,并将报表显示在窗体上。
制表用数据与绘图用数据一样,不必再准备数据,直接调用DrawingForm类的GetData方法就可以得到。
由于窗口可以自动滚动,所以勿需对报表分页。
报表编程与图形编程实质是相同的,不同在于报表编程更多的是对文本的格式控制。
⒈ 准备界面
与前两讲类似,在实例程序中添加一个窗体,再在窗体上添加一个PictureBox控件,用作显示报表的界面。在窗体加载时将报表显示出来。
此外,为了让用户选择打印报表、预览报表和设置打印页面功能,在窗体添加一个工具条。
⑴ 添加窗体和PictureBox控件
为窗体或PictureBox控件设置以下属性:
1) 窗体的名称为“ReportForm”。
2)窗体的Text属性为“制表”。
3)保持PictureBox控件的Name属性的默认值“pictureBox1”不变。
4)设置PictureBox 控件的Dock属性为“Fill”、BackColor属性为“White”。
5)适当调整窗体的大小。
⑵ 创建工具条
工具条可以在 Windows 窗体应用程序中承载菜单、控件和用户控件。通过点击工具条,用户可以方便地选择自己所需的功能。
在VS.NET 2005中,早期版本的工具条ToolBar控件被ToolStrip 控件替换。ToolStrip 控件不仅功能更丰富,而且使用也更方便。
报表编程既要绘制报表,还要打印报表、预览报表和设置打印页面。为了让用户灵活地选择这些功能,可以在窗体上添加3个工具条,供用户选择打印报表、预览报表和设置打印页面。
创建工具条与创建菜单很类似:
1)打开“工具箱”的“菜单和工具栏”选项卡,将ToolStrip控件拖放到制表窗体上。
2)单击工具栏上提示为“添加toolStripButton”的矩形,从列表框中选择“Button”,即添加一个工具条。同时,新项框移到右边,以允许添加其他工具条。
3)选择添加的工具条,设置ToolTipText属性为“打印”。这是系统为用户显示的工具条提示。
4)从新项框列表中选择“Separator”,添加一个分隔符。
5)继续添加一个工具条,设置ToolTipText属性为“打印预览”。
6)再添加一个分隔符“Separator”。
7)最后,添加一个工具条,设置ToolTipText属性为“页面设置”。
完成以上步骤后,制表窗体布局如图2所示。

图2 制表窗体布局
⒉ 取数据
制表用数据与绘图用数据一样,所以直接调用DrawingForm类的GetData方法就可以得到制表所用的数据。为此,编写或修改以下代码:
(1)为了引用DrawingForm类,在ReportForm. h中添加以下代码以包含DrawingForm.h包含文件:
#include "DrawingForm.h"
(2)为了在ReportForm.类中调用DrawingForm类的GetData方法,将DrawingForm类中声明GetData方法的访问修饰符由private改为public:
public: DataTable^ GetData(String^ selectCommand)
(3)在ReportForm.类中添加Table方法,用于绘制在窗体中显示的报表。在Table方法中,调用DrawingForm类的GetData方法以获取数据表:
private:void Table(Graphics^ g)
{
// 构造SQL select语句。
String^ selectCommand="select convert(varchar(10),日期,120) as '日期',开盘价,
收盘价,成交量,最高价,最低价 from StockList";
// 调用GetData方法返回包含个股(指数)数据的数据表。
DrawingForm^ drawingfrm=gcnew DrawingForm();
DataTable^ table = drawingfrm->GetData(selectCommand);
int dayCount=table->Rows->Count; // 数据表记录(交易日)数。
if (dayCount<=0)
{
MessageBox::Show( "无数据!");
return;
}
}
⒊ 绘页眉
页眉可以是报表的名称。这里指定页眉的字符串是“上证指数行情表”。绘页眉之前,要计算页眉的坐标,设置页眉的字体、字号、画笔等参数。
编写代码如下:
// 设置页面。
float p_width=627.0F; // 边距以内页面部分的矩形区域的宽度。
float p_left=100.0F; // 边距以内页面部分的矩形区域左边缘的 x 坐标。
float p_top=100.0F; // 边距以内页面部分的矩形区域上边缘的 y 坐标。
float p_h=p_top; // 累计报表页面(含边距)高度。
float rs=5.0F; // 行间距。
float cs=3.0F; // 列间距。
const int cn=6; // 报表细节的列数。
// 绘制页眉。
String^ ttlString = "上证指数行情表";
int fn=14; // 设置字号。
float fp_q=1.0F; // 字号放大比例。
System::Drawing::Font^ ttlFont =
gcnew System::Drawing::Font("Arial", fn*fp_q,
GraphicsUnit::Pixel); // 设置字体。
System::Drawing::SolidBrush^ ttlBrush = gcnew
System::Drawing::SolidBrush(System::Drawing::
Color::Black); // 准备实心画笔。
SizeF ttlSize = g->MeasureString(
ttlString, ttlFont);
float ttlWidth= ttlSize.Width; // 获取页眉宽度(像素个数)。
float ttl_x =p_left+(p_width-ttlWidth)/2; // 为使页眉在页面水平方向居中,
// 计算页眉的起始横坐标。
float ttl_y=p_top; // 页眉的起始纵坐标。
g->DrawString( ttlString,ttlFont,
ttlBrush ,ttl_x,ttl_y); // 画页眉。
p_h=p_h+ttlSize.Height;
|