在datareport 的Initialize事件中加入
set datareport.datasourse=rs

解决方案 »

  1.   

    VB 6之数据报表使用技巧 于溪   VB 6.0专业版和企业版中的数据报表设计器与数据环境设计器是数据访问的新内容。MSDN 所提供的Prjnwind.vbp 示例工程在设计阶段(Design Time)就已将DataEnvironment设为DataReport的数据源,并将打印格式也设好,这种做法不太利于程序的通用性。当然,我们也可以对DataEnvironment编程,在运行阶段(Run Time)控制数据源。其实,DataReport可以完全脱离DataEnvironment,而打印由动态SQL生成的Recordset。  实现代码如下:  Private Sub DataReport_Initialize()   …  Dim adoConnectionX As New ADODB.Connection  Dim adoRecordsetX As New ADODB.Recordset  adoConnectionX.Open″Provider=Microsoft.Jet.OLEDB.3.51;Persist Security   Info=False;Data Source=″ & App.Path & ″\Xxx.mdb″  adoRecordsetX.Open ″Select * From表名″, adoConnectionX  Set DataReportX.DataSource = adoRecordsetX   ′设置 DataReport 的数据源   …  由VB 6 所提供的DataReport.Sections.Item(Index).Controls.Item(Index)...这样的语法不太利于编程控制数据报表设计器的专用控件的位置、大小等各种属性。但是,我们可以编程根据控件所在区域(Section)和所属类别等将它们分成若干集合(Collection),然后通过控制集合的元素来控制其所代表的控件。当然,在设计阶段我们要将足够多的控件绘制到DataReport上备用。实现的主要部分代码如下:  …  ′根据控件所在区域(Section)和所属类别分集合(Collection)  Dim RHSec4—RptLbl—Collection As New Collection  …  ′页标头(PageHeader)区域 Shape(RptShape) 控件集合  Dim PHSec2—RptShp—Collection As New Collection  …  ′细节(Detail)区域 TextBox(RptTextBox) 控件集合  Dim DSec1—RptTxt—Collection As New Collection  …  Dim Ctl As Object  …  For Each Ctl In Me.Sections.Item(″Section1″).Controls ′Section1   Select Case TypeName(Ctl)   Case ″RptLabel″  DSec1—RptLbl—Collection.Add Ctl   Ctl.Caption = ″"   Case ″RptShape″  DSec1—RptShp—Collection.Add Ctl   Case ″RptTextBox″  Ctl.DataField = adoRecordset.Fields.Item(0).Name   ′先将所有TextBox(RptTextBox) 控件绑定到某一字段,否则报错!  DSec1—RptTxt—Collection.Add Ctl  End Select  Ctl.Visible = False  Next Ctl  …  ′以下通过控制集合的元素来准确有效的控制这些元素所代表的控件。  Dim i As Integer  Dim bFmt As StdDataFormat   ′定义布尔(Boolean)型字段的数据格式  Set bFmt = New StdDataFormat  bFmt.Type = fmtBoolean  bFmt.TrueValue = ″是″  bFmt.FalseValue = ″否″  For i = 0 To 5   ′只打印前几个字段,Shape(RptShape) 控件用来显示单元格,页标头(PageHeader)区域:显示列表头(Caption)  With PHSec2—RptShp—Collection.Item(i + 1) ′单元格   .Visible = True   If i = 0 Then   .Left = 0   Else   .Left = PHSec2—RptShp—Collection.Item(i).Left + PHSec2—RptShp—Collection.Item(i).Width   End If   .Top = 0   .Height = 400   ′可根据字体设 单位:缇字体的高度(单位:缇)可使用 Form、PictureBox 的TextHeight 方法或 API 获得   .Width = 1500   ′这里可根据实际情况用数组分别设置各列的列宽  End With  With PHSec2—RptLbl—Collection.Item(i + 1) ′列表头标题(Caption)   .Left = PHSec2—RptShp—Collection.Item(i + 1).Left + 100   .Top = PHSec2—RptShp—Collection.Item(i + 1).Top + 100   .Height = PHSec2—RptShp—Collection.Item(i + 1).Height - 180   .Width = PHSec2—RptShp—Collection.Item(i + 1).Width - 200   .Caption = adoRecordsetX.Fields.Item(i).Name   .Alignment = rptJustifyCenter   .Visible = True  End With  ′细节(Detail)区域显示:  With DSec1—RptShp—Collection.Item(i + 1) ′单元格   If i = 0 Then   DSec1—RptShp—Collection.Item(i + 1).Left = 0   Else  .Left = DSec1—RptShp—Collection.Item(i).Left + DSec1—RptShp—Collection.Item(i).Width   End If   .Top = 0   .Height = PHSec2—RptShp—Collection.Item(i + 1).Height   .Width = PHSec2—RptShp—Collection.Item(i + 1).Width   .Visible = True  End With  With DSec1—RptTxt—Collection.Item(i + 1) ′数据   .Height = DSec1—RptShp—Collection.Item(i + 1).Height - 180   .Left = DSec1—RptShp—Collection.Item(i + 1).Left + 100   .Top = DSec1—RptShp—Collection.Item(i + 1).Top + 100   .Width = DSec1—RptShp—Collection.Item(i + 1).Width - 200   .DataField = adoRecordsetX.Fields.Item(i).Name ′重新绑定字段   Select Case adoRecordsetX.Fields.Item(i).Type ′可根据字段数据类型设置数据格式   Case adBigInt, adInteger, adSmallInt   .DataFormat.Format = ″###,##0″   ′数字   .Alignment = rptJustifyRight   Case adBoolean   Set .DataFormat = bFmt   ′布尔型字段设为自定义格式  .Alignment = rptJustifyCenter   Case adCurrency  .DataFormat.Format = ″###,##0.00″   ′货币   .Alignment = rptJustifyRight   Case adDate, adDBDate, adDBTimeStamp  .DataFormat.Format = ″Long Date″   ′日期、时间   .Alignment = rptJustifyRight   Case Else ′其它,如:文本等  .Alignment = rptJustifyLeft   End Select  .Visible = True  End With  Next i  DataReport1.Sections.Item(″Section2″).Height = 400  DataReport1.Sections.Item(″Section1″).Height = 400  …  End Sub   该方案在PWin 9.X 和VB 6.0下通过。  如果要打印分级(层)Recordset ,还要在Datareport 上增加分组标头和分组注脚区等,并根据控件的具体功能、用途为其定义各类控件集合,设计出更复杂的报表。