本人做了一个简单的datareport,调用show方法后总是提示datareport超出了纸张的大小。就其原因应该是系统默认纸张纵向打印时超出了纸张的边界,我想设置在调用show方法后datareport显示的报表是以纸张的横向显示和打印,应该怎么做?另外怎样在datareport中调整纸张大小?

解决方案 »

  1.   

    datareport.papersize
    详细内容查msdn吧
      

  2.   

    to sickleliu(疾风之狼) 
        我查了msdn,好像papersize属性只能应用于Printer 对象和 Printers 集合,调用datareport.papersize进行赋值时,会出现未找到方法或数据成员的编译错误。
    to activewf(路漫漫) 
        我的报表肯定超过了15.5,根据a4纸张的横向长度,我的报表横向设计长度大约在22左右。前两天这种22长的报表还能正常的按横向显示和打印,可今天系统就不认了,只能纵向显示。可我也没有动report的任何东西呀!这会不会和打印机有关? 请大家指教!
      

  3.   

    这是我电脑上搜集的文章,我还没看过,不知对你是否有用:
    如何打印通用数据报表
    Microsoft Visual Basic 6.0 专业版和企业版中的数据报表设计器(Data Report Designer)与数据环境设计器(Data Environment Designer)是数据访问的新内容。Microsoft DeveloperNetwork Library Visual Studio 6.0 中文版所提供示例应用程序:\Samples\Vb98\DataRept\ 目录下的Prjnwind.vbp 工程使用一个数据环境作为数据源,演示了数据报表设计器的基本功能。该示例在程序设计阶段(Design Time)就已将DataEnvironment设为DataReport的数据源,并将打印格式也一并设好以备打印,这样作不利于程序的通用性。当然,我们可以在程序运行阶段(Run Time)用语句更改DataEnvironment 的连接(Connection)的命令(Command)所对应的记录集(rsCommand)等参数来打印不同的数据(二维表),换句话说 Data Environment是可编程的。其实,DataReport还可以使用别的数据源(DataSource)。但是,为什么我们在程序设计阶段不能将ADO Data 控件(ADODC)设为DataReport的数据源呢?原因很简单,DataReport 需要的是一个全局的或者是本设计器模块内的数据源(记录集),而ADODC是窗体模块级的,我们只需将Adodc.Recordset 传给一个全局级的 Recordset 变量,再将该Recordset 设为DataReport的DataSource 即可。这样我们就可以脱离Data Environment 使用 DataReport 打印动态生成的Recordset了。DataReport使用的另一个难点就是在程序运行阶段用语句控制数据报表设计器的专用控件。我们只能通过 VB6 自身提供的DataReport.Sections.Item(Index).Controls.Item(Index)…这样的语法来控制这些数据报表设计器专用控件,而且DataReport不能象窗体(Form)那样可以在程序运行阶段用语句动态加入控件,而且同类控件无索引(Index),而是在整个DataReport的控件集中拥有一个索引来标识控件,这样就非常不利于分别控制不同类的控件。还好,VB 提供了集合对象(Collection)我们就可以将数据报表设计器专用控件,根据其所在的区域(Sections)和所属控件类别等将它们分成若干集合,然后就可以通过控制集合的元素来准确有效地控制这些元素所代表的控件。在程序设计阶段我们要将足够多的控件绘制到DataReport上备用。实现上面的程序代码均可以编写到Sub DataReport_Initialize()事件过程里。经过以上改造我们就可以在程序运行阶段动态控制DataReport了。示例代码如下:
      

  4.   

    Option Explicit
    Private Sub DataReport_Initialize()
    '以下准备数据源(记录集)
    '要打印的数据源(记录集)必须是一个全局级别的,或者是本设计器模块级别的记录集
    Dim adoConnectionX As New ADODB.Connection
    Dim adoRecordsetX As New ADODB.Recordset
    ‘数据库使用的是 Northwind.mdb
    adoConnectionX.Open "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" & App.Path & "\Northwind.mdb"
    adoRecordsetX.Open "产品", adoConnectionX
    Set DataReport1.DataSource = adoRecordsetX '设置 DataReport 的数据源
    '以下根据控件所在区域(Sections)和所属控件类别等将它们分成若干集合
    Dim PHSec2_RptLbl_Collection As New Collection '页标头(PageHeader)区域 Label(RptLabel) 控件集合
    Dim DSec1_RptLbl_Collection As New Collection '细节(Detail)区域 Label(RptLabel) 控件集合
    Dim PFSec3_RptLbl_Collection As New Collection '页注脚(PageFooter)区域 Label(RptLabel) 控件
    Dim PHSec2_RptShp_Collection As New Collection '页标头(PageHeader)区域 Shape(RptShape) 控件集合
    Dim DSec1_RptShp_Collection As New Collection '细节(Detail)区域 Shape(RptShape) 控件集合
    Dim PFSec3_RptShp_Collection As New Collection '页注脚(PageFooter)区域 Shape(RptShape) 控件集合
    Dim DSec1_RptTxt_Collection As New Collection '细节(Detail)区域 TextBox(RptTextBox) 控件集合
    'TextBox (RptTextBox) 控件只能绘制到细节(Detail)区域
    Dim PHSec2_RptImg_Collection As New Collection '页标头(PageHeader)区域 Image(RptImage) 控件集合
    Dim DSec1_RptImg_Collection As New Collection '细节(Detail)区域 Image(RptImage) 控件集合
    Dim PFSec3_RptImg_Collection As New Collection '页注脚(PageFooter)区域 Image(RptImage) 控件集合
    Dim PHSec2_RptLine_Collection As New Collection '页标头(PageHead)区域 Line(RptLine) 控件集合
    Dim DSec1_RptLine_Collection As New Collection '细节(Detail)区域 Line(RptLine) 控件集合
    Dim PFSec3_RptLine_Collection As New Collection '页注脚(PageFooter)区域 Line(RptLine) 控件集合
    Dim Ctl 'As Object
    For Each Ctl In DataReport1.Sections.Item("Section2").Controls 'Section2
    Select Case TypeName(Ctl)
    Case "RptLabel"
    PHSec2_RptLbl_Collection.Add Ctl
    Ctl.Caption = ""
    Case "RptShape"
    PHSec2_RptShp_Collection.Add Ctl
    Case "RptLine"
    PHSec2_RptLine_Collection.Add Ctl
    Case "RptImage"
    PHSec2_RptImg_Collection.Add Ctl
    End Select
    Ctl.Left = 0
    Ctl.Top = 0
    Ctl.Height = 300
    Ctl.Width = (Rnd + 1) * 600
    Ctl.Visible = False
    Next CtlFor Each Ctl In DataReport1.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 = adoRecordsetX.Fields.Item(0).Name '先将所有TextBox(RptTextBox) 控件绑定到某一字段
    '否则报错!
    DSec1_RptTxt_Collection.Add Ctl
    Case "RptLine"
    DSec1_RptLine_Collection.Add Ctl
    Case "RptImage"
    DSec1_RptImg_Collection.Add Ctl
    End Select
    Ctl.Left = 0
    Ctl.Top = 0
    Ctl.Height = 400
    Ctl.Width = 600
    Ctl.Visible = False
    Next Ctl
    For Each Ctl In DataReport1.Sections.Item("Section3").Controls 'Section3
    Select Case TypeName(Ctl)
    Case "RptLabel"
    PFSec3_RptLbl_Collection.Add Ctl
    Ctl.Caption = ""
    Case "RptShape"
    PFSec3_RptShp_Collection.Add Ctl
    Case "RptLine"
    PFSec3_RptLine_Collection.Add Ctl
    Case "RptImage"
    PFSec3_RptImg_Collection.Add Ctl
    End Select
    Ctl.Left = 0
    Ctl.Top = 0
    Ctl.Height = 400
    Ctl.Width = (Rnd + 1) * 600
    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 '这里可根据实际情况分别设置各列的列宽
    .BorderColor = vbRed
    .BorderStyle = rptBSSolid
    .Shape = rptShpRectangle
    End With
    With PHSec2_RptLbl_Collection.Item(i + 1) '列表头标题(Caption)
    .Visible = True
    .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
    .BorderStyle = rptBSSolid '测试用
    .BorderColor = vbGreen '测试用
    .BackStyle = rptBkOpaque '测试用
    .BackColor = vbYellow '测试用
    .Alignment = rptJustifyCenter
    .Font.Name = ""
    .Font.Size = 10
    .Font.Bold = False
    .Font.Italic = False
    .Font.Strikethrough = False
    .Font.Underline = False
    .ForeColor = vbBlue
    End With
    '细节(Detail)区域显示:
    With DSec1_RptShp_Collection.Item(i + 1) '单元格
    .Visible = True
    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
    .BorderColor = PHSec2_RptShp_Collection.Item(i + 1).BorderColor
    .BorderStyle = PHSec2_RptShp_Collection.Item(i + 1).BorderStyle
    .Shape = PHSec2_RptShp_Collection.Item(i + 1).Shape
    End With
    With DSec1_RptTxt_Collection.Item(i + 1) '数据
    .Visible = True
    .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
    .Font.Name = PHSec2_RptLbl_Collection.Item(i + 1).Font.Name
    .Font.Size = PHSec2_RptLbl_Collection.Item(i + 1).Font.Size
    .Font.Bold = PHSec2_RptLbl_Collection.Item(i + 1).Font.Bold
    .Font.Italic = PHSec2_RptLbl_Collection.Item(i + 1).Font.Italic
    .Font.Strikethrough = PHSec2_RptLbl_Collection.Item(i + 1).Font.Strikethrough
    .Font.Underline = PHSec2_RptLbl_Collection.Item(i + 1).Font.Underline
    .ForeColor = PHSec2_RptLbl_Collection.Item(i + 1).ForeColor
    .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
    ' .BorderStyle = rptBSSolid '测试用
    ' .BorderColor = vbGreen '测试用
    ' .BackStyle = rptBkOpaque '测试用
    ' .BackColor = vbYellow '测试用
    End With
    Next i
    DataReport1.Sections.Item("Section2").Height = 400
    DataReport1.Sections.Item("Section1").Height = 400
    'VB6 提供的控制方法不利于编程分别控制各类控件:
    Debug.Print Me.Sections.Item("Section2").Controls.Item("Label1").Caption
    End Sub
      

  5.   

    这里问题来的突然去的也很怪异,当我重新启动了计算机后就奇迹的能横向显示了!  我查了以前关于这个方面的帖子(报表%横向),发现遇到这种问题的人不少,应该算FAQ了吧。其中一种解决方案是装sp5后调用DataReport1.Orientation = rptOrientLandscape,当然,只能等这个程序再出现这个毛病再说了。
    to snail2011(尘潇) 
       你发的“打印通用数据报表”好像和报表横向打印没有多大关系,但对我以后报表设计很有启发,非常感谢你的支持!