1、label1.caption和数据库字段绑定
2、设置虚线,找找格式设置吧。可以设置页眉和页角
3、这个没法自动进行,好象需要自己写代码把所有的东西缩放实际内容的X倍,
有一个办法,遍历所有的控件。
dim x as control
for x to controls
x.left=
x.top=
x.width=
x.height=next x

解决方案 »

  1.   

    对了,我的Label放在页标头区域,无法和数据库字段绑定。
      

  2.   

    用activereport 吧。可以实现你的功能。
      

  3.   

    对“3、在DataReport中设置好打印格式后,如何在打印时将打印内容缩放为实际内容的x倍?”补充一下,我的实际需求是:我已经按照B4纸大小设计好报表格式,如何当用户选择用A4纸打印时,让报表内容自动适应A4纸。
    除了按A4纸大小另做一套报表外,有没有别的办法?
      

  4.   

    label1.caption可以在你显示DataReport之前给他赋值
      

  5.   

    《VB 6之数据报表使用技巧》(1999.11.1)
    http://media.ccidnet.com/media/ciw/871/b1301.htm 
      

  6.   

    1:DataReport1.Visual Basic中如何实现动态报表是一个在众多VB网站论坛上提问频率很高的问题,在实际项目中, 作者也遇到这个问题, 经过一番深入研究,用一种简单的方法在Visual Basic中实现了动态报表。
    Visual Basic中制作报表的工具有很多,如Crystal报表编辑器、Datareport报表窗体、Printer对象以及象Vsview等一些第三方控件。但Crystal报表编辑器一般只能制作定制报表,Printer对象操纵起来非常复杂,第三方控件多数需要购买,费用不非。作者制作动态报表是通过Datareport窗体实现的,以下通过一个具体的例子说明是如何实现动态报表的。
    假设在C盘dongtai目录下存放一个Access数据库stock.mdb,其中的"股票行情表"用来记录股票行情,"股票行情表"的数据结构如1表所示:
    表1 "股票行情表"数据结构
    --------------------------------------------------------------------------- 
    字段名称 ID stockno stockname price swing maxprice minprice bargain
    ---------------------------------------------------------------------------
    数据类型 长整型 文本 文本 双精度型 双精度型 双精度型 双精度型 长整型
    ---------------------------------------------------------------------------
    说 明 序号 股票代号 股票名称 收盘价 涨跌 最高价 最低价 成交量
    --------------------------------------------------------------------------- 
    如果要设计这样的一个报表,报表输出字段由用户自己决定,用Datareport窗体如何设计呢?下面一步一步地说明。
    1. 熟悉Datareport窗体和数据报表控件
    Datareport窗体是一个和普通窗体相似的窗体,最大的差别是该窗体上只能摆放数据报表控件,这种类型的控件只有六种,他们分别是:RptLabel,Rpt Text Box,RptImage,RptShape,RptLine,RptFunction。从名称上基本可以识别他们的用途,RptLabel用来显示非数据绑定的文本的标签;通常用来制作报表的页标题;Rpt Text Box显示数据绑定的文本的内容,即显示数据库的字段的内容;RptImage显示一个图形,例如一个公司的商标;RptShape能够画出许多图形,强调信息或增强视觉效果;RptLine能够在报表中画线,分割报表种不同的区域;RptFunction允许在报表标题或报表注脚区域摆放,它包含一个简单的数学统计函数。Datareport窗体和数据报表控件如图1所示。为了能够输出所有字段,必须在Datareport窗体不同的区域中摆放足够数量的相关报表数据控件,本例最多字段为八个,所以在"页标头"区域(section2)摆放了八个Rptlabel控件、九条竖分割线和上下两条横线,在"细节"区域(section1)摆放了八个Rpt Text Box 控件、九条竖分割线和下面一条横线,如图1所示。同时为了以后的编码方便,对各控件采用如下的命名方式:控件名称为控件类型+区域号+序号,例如,"页标头"区域(section2)八个Rptlabel控件分别命名为label21、label22、label23……label28,细节"区域(section1)的八个Rpt Text Box 控件分别命名为Text11、Text12、Text13……Text18,各区域的竖分割线采用同样的命名方式,但横分割线以控件类型+区域号来命名,如"页标头"区域中的上下两条横线分别命名为Line2和Line_2,在后面的代码里可以看出这种命名方式的好处。
    Datareport窗体中最重要的三种数据控件是Rpt Text Box、Rptlabel和RptFunction,必须分别设置它们的属性,Rpt Text Box最重要的属性是datafield,该属性指明了绑定记录的字段名称;Rptlabel最重要的属性是Caption,该属性指明要显示的文本内容;RptFunction最重要的属性是datafield和functiontype,前者指明要绑定且作统计的记录的字段名称,后者指明统计函数的类型。这三种控件有一共同属性是Gangrow,该属性值为True时,当显示的内容超过控件的宽度时可以换行。Datareport窗体也有很多属性,如LeftMargin、RightMargin 、TopMargin 、BottomMargin 、reportwidth 、DataSource 等,其中reportwidth 设置报表的纸面宽度(必须减去左右页边距的宽度),reportwidth 须与打印机设置的纸面大小相对应,DataSource设置Datareport窗体的数据源。需要说明的是Datareport窗体中的各个区域都是对象,如section1.section2等,他们也有很多的属性,其中重点提出Keeptogther属性,当Keeptogether为True时,如果某条记录处在一页的最下面,但又不能够完全的打印出来时,可强制这条记录换到下一页输出,从而保证数据的完整性。以上只是简单的说明了Datareport窗体中涉及到的一些重要属性,其它未加说明的属性可在相关书籍和MSDN中查阅。
     2.主界面设计
    作者设计的主界面如图2所示。其中候选字段的ListBox(lst_candidate)用来显示所有原始字段,选中字段的ListBox(lst_selected)用来记录选中的以报表形式输出的字段,两个ListBox之间的带有"<"和">"标题的按钮用来添加和移去字段,用一个文本框(txt_caption)设置报表的标题,点击"输出报表"(cmd_report)按钮即可输出报表。
    3.字段宽度的控制
    字段宽度的控制在报表设计中很重要,这里是通过lst_selected的Itemdata的属性实现的,仅用一个子程序可完成对lst_selected的Itemdata的属性赋值,代码如下。
    '******************************************************************
    '字段宽度控制子程序
    Private Sub fieldwidth(lst As ListBox)
    Dim i As Integer
    Const wordwidth As Integer = 201 '五号字的宽度为201缇
    For i = 0 To lst.ListCount - 1
    Select Case lst.List(i)
    Case "序号"
    lst.ItemData(i) = wordwidth * 3
    Case "股票代号"
    lst.ItemData(i) = wordwidth * 5
    Case "股票名称"
    lst.ItemData(i) = wordwidth * 6
    Case "收盘价"
    lst.ItemData(i) = wordwidth * 5
    Case "涨跌"
    lst.ItemData(i) = wordwidth * 4
    Case "最高价"
    lst.ItemData(i) = wordwidth * 5
    Case "最低价"
    lst.ItemData(i) = wordwidth * 5
    Case "成交量"
    lst.ItemData(i) = wordwidth * 4
    End Select
    Next i
    End Sub
    '******************************************************************4.设置Datareport窗体属性,控制输出格式
    设置Datareport窗体的属性,控制输出格式也可用一子过程完成,需要说明的是为Datareport和数据控件设置属性时,在设计编码过程中,Visual Basic多数不出现正常情况下的智能提示,不必大惊小怪,完整代码如下。 
    '***********************************************************************
    '设置报表窗体各种参数,控制输出格式
    Private Sub setDatareport(lst As ListBox, dtr As Datareport, scaption As String)
    Dim leftpos As Long 'leftpos为存放控件left属性的变量
    Dim reportwidth As Long 'reportwidth为存放Datareport总宽度的变量
    Dim i As Integer'求总宽度
    For i = 0 To lst.ListCount - 1
    reportwidth = reportwidth + lst.ItemData(i)
    Next
    '初始化
    With dtr
    '设置数据源,页边距,标题,横向分割线,section1、2区第一条竖分割线
    .LeftMargin = 1440
    .RightMargin = 1440
    .TopMargin = 1440
    .BottomMargin = 144
    .reportwidth = Printer.Width - 2880 - 20
    Set .DataSource = rs 'rs为ADODB数据源
    .Sections("section4").Controls.Item("label41").Caption = scaption
    .Sections("section4").Controls.Item("label41").Width = reportwidth
    .Sections("section4").Controls.Item("label42").Width = reportwidth
    .Sections("section2").Controls.Item("line_2").Width = reportwidth
    .Sections("section2").Controls.Item("line2").Width = reportwidth
    .Sections("section1").Controls.Item("line1").Width = reportwidth
    .Sections("section2").Controls.Item("line20").Left = 0
    .Sections("section1").Controls.Item("line10").Left = 0
    End With'为section1,2区设置数据
    leftpos = 0
    For i = 0 To lst.ListCount - 1
    dtr.Sections("section2").Controls.Item("label1" & (i + 1)).Caption = lst.List(i)
    dtr.Sections("section2").Controls.Item("label1" & (i + 1)).Width = lst.ItemData(i)
    dtr.Sections("section2").Controls.Item("label1" & (i + 1)).Left = leftpos
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).DataField = lst.List(i)
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).Width = lst.ItemData(i)
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).Left = leftpos
    dtr.Sections("section2").Controls.Item("line2" & (i + 1)).Left = leftpos + lst.ItemData(i)
    dtr.Sections("section1").Controls.Item("line1" & (i + 1)).Left = leftpos + lst.ItemData(i)
    leftpos = leftpos + lst.ItemData(i)
    '特殊字段的格式特殊处理
    If lst.List(i) = "收盘价" Or lst.List(i) = "最低价" Or lst.List(i) = "最高价" Then
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).DataFormat.Format = "¥#,##0.00"
    End If
    If lst.List(i) = "涨跌" Then
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).DataFormat.Format = "#,##0.00"
    End If
    If lst.List(i) = "成交量" Then
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).DataFormat.Format = "#,##0"
    End If
    Next i'对不用的text控件必须设置其datafield属性,如lst.List(0),否则出错,但一定让其不可见
    '其他不用的label,line控件同样均不可见
    i = lst.ListCount
    While i < (dtr.Sections("section1").Controls.Count - 10) 
    '10 为section1区域的非text控件的控件总数
    i = i + 1
    dtr.Sections("section1").Controls.Item("text1" & i).DataField = lst.List(0)
    dtr.Sections("section1").Controls.Item("text1" & i).Visible = False
    dtr.Sections(
      

  7.   

    DataReport3.Sections("section5").Controls("label10").Caption = Text1.Texttext1.text就是变量
      

  8.   

    Visual Basic中如何实现动态报表是一个在众多VB网站论坛上提问频率很高的问题,在实际项目中, 作者也遇到这个问题, 经过一番深入研究,用一种简单的方法在Visual Basic中实现了动态报表。
    Visual Basic中制作报表的工具有很多,如Crystal报表编辑器、Datareport报表窗体、Printer对象以及象Vsview等一些第三方控件。但Crystal报表编辑器一般只能制作定制报表,Printer对象操纵起来非常复杂,第三方控件多数需要购买,费用不非。作者制作动态报表是通过Datareport窗体实现的,以下通过一个具体的例子说明是如何实现动态报表的。
    假设在C盘dongtai目录下存放一个Access数据库stock.mdb,其中的"股票行情表"用来记录股票行情,"股票行情表"的数据结构如1表所示:
    表1 "股票行情表"数据结构
    --------------------------------------------------------------------------- 
    字段名称 ID stockno stockname price swing maxprice minprice bargain
    ---------------------------------------------------------------------------
    数据类型 长整型 文本 文本 双精度型 双精度型 双精度型 双精度型 长整型
    ---------------------------------------------------------------------------
    说 明 序号 股票代号 股票名称 收盘价 涨跌 最高价 最低价 成交量
    --------------------------------------------------------------------------- 
    如果要设计这样的一个报表,报表输出字段由用户自己决定,用Datareport窗体如何设计呢?下面一步一步地说明。
    1. 熟悉Datareport窗体和数据报表控件
    Datareport窗体是一个和普通窗体相似的窗体,最大的差别是该窗体上只能摆放数据报表控件,这种类型的控件只有六种,他们分别是:RptLabel,Rpt Text Box,RptImage,RptShape,RptLine,RptFunction。从名称上基本可以识别他们的用途,RptLabel用来显示非数据绑定的文本的标签;通常用来制作报表的页标题;Rpt Text Box显示数据绑定的文本的内容,即显示数据库的字段的内容;RptImage显示一个图形,例如一个公司的商标;RptShape能够画出许多图形,强调信息或增强视觉效果;RptLine能够在报表中画线,分割报表种不同的区域;RptFunction允许在报表标题或报表注脚区域摆放,它包含一个简单的数学统计函数。Datareport窗体和数据报表控件如图1所示。为了能够输出所有字段,必须在Datareport窗体不同的区域中摆放足够数量的相关报表数据控件,本例最多字段为八个,所以在"页标头"区域(section2)摆放了八个Rptlabel控件、九条竖分割线和上下两条横线,在"细节"区域(section1)摆放了八个Rpt Text Box 控件、九条竖分割线和下面一条横线,如图1所示。同时为了以后的编码方便,对各控件采用如下的命名方式:控件名称为控件类型+区域号+序号,例如,"页标头"区域(section2)八个Rptlabel控件分别命名为label21、label22、label23……label28,细节"区域(section1)的八个Rpt Text Box 控件分别命名为Text11、Text12、Text13……Text18,各区域的竖分割线采用同样的命名方式,但横分割线以控件类型+区域号来命名,如"页标头"区域中的上下两条横线分别命名为Line2和Line_2,在后面的代码里可以看出这种命名方式的好处。
    Datareport窗体中最重要的三种数据控件是Rpt Text Box、Rptlabel和RptFunction,必须分别设置它们的属性,Rpt Text Box最重要的属性是datafield,该属性指明了绑定记录的字段名称;Rptlabel最重要的属性是Caption,该属性指明要显示的文本内容;RptFunction最重要的属性是datafield和functiontype,前者指明要绑定且作统计的记录的字段名称,后者指明统计函数的类型。这三种控件有一共同属性是Gangrow,该属性值为True时,当显示的内容超过控件的宽度时可以换行。Datareport窗体也有很多属性,如LeftMargin、RightMargin 、TopMargin 、BottomMargin 、reportwidth 、DataSource 等,其中reportwidth 设置报表的纸面宽度(必须减去左右页边距的宽度),reportwidth 须与打印机设置的纸面大小相对应,DataSource设置Datareport窗体的数据源。需要说明的是Datareport窗体中的各个区域都是对象,如section1.section2等,他们也有很多的属性,其中重点提出Keeptogther属性,当Keeptogether为True时,如果某条记录处在一页的最下面,但又不能够完全的打印出来时,可强制这条记录换到下一页输出,从而保证数据的完整性。以上只是简单的说明了Datareport窗体中涉及到的一些重要属性,其它未加说明的属性可在相关书籍和MSDN中查阅。
     2.主界面设计
    作者设计的主界面如图2所示。其中候选字段的ListBox(lst_candidate)用来显示所有原始字段,选中字段的ListBox(lst_selected)用来记录选中的以报表形式输出的字段,两个ListBox之间的带有"<"和">"标题的按钮用来添加和移去字段,用一个文本框(txt_caption)设置报表的标题,点击"输出报表"(cmd_report)按钮即可输出报表。
    3.字段宽度的控制
    字段宽度的控制在报表设计中很重要,这里是通过lst_selected的Itemdata的属性实现的,仅用一个子程序可完成对lst_selected的Itemdata的属性赋值,代码如下。
    '******************************************************************
    '字段宽度控制子程序
    Private Sub fieldwidth(lst As ListBox)
    Dim i As Integer
    Const wordwidth As Integer = 201 '五号字的宽度为201缇
    For i = 0 To lst.ListCount - 1
    Select Case lst.List(i)
    Case "序号"
    lst.ItemData(i) = wordwidth * 3
    Case "股票代号"
    lst.ItemData(i) = wordwidth * 5
    Case "股票名称"
    lst.ItemData(i) = wordwidth * 6
    Case "收盘价"
    lst.ItemData(i) = wordwidth * 5
    Case "涨跌"
    lst.ItemData(i) = wordwidth * 4
    Case "最高价"
    lst.ItemData(i) = wordwidth * 5
    Case "最低价"
    lst.ItemData(i) = wordwidth * 5
    Case "成交量"
    lst.ItemData(i) = wordwidth * 4
    End Select
    Next i
    End Sub
    '******************************************************************4.设置Datareport窗体属性,控制输出格式
    设置Datareport窗体的属性,控制输出格式也可用一子过程完成,需要说明的是为Datareport和数据控件设置属性时,在设计编码过程中,Visual Basic多数不出现正常情况下的智能提示,不必大惊小怪,完整代码如下。 
    '***********************************************************************
    '设置报表窗体各种参数,控制输出格式
    Private Sub setDatareport(lst As ListBox, dtr As Datareport, scaption As String)
    Dim leftpos As Long 'leftpos为存放控件left属性的变量
    Dim reportwidth As Long 'reportwidth为存放Datareport总宽度的变量
    Dim i As Integer'求总宽度
    For i = 0 To lst.ListCount - 1
    reportwidth = reportwidth + lst.ItemData(i)
    Next
    '初始化
    With dtr
    '设置数据源,页边距,标题,横向分割线,section1、2区第一条竖分割线
    .LeftMargin = 1440
    .RightMargin = 1440
    .TopMargin = 1440
    .BottomMargin = 144
    .reportwidth = Printer.Width - 2880 - 20
    Set .DataSource = rs 'rs为ADODB数据源
    .Sections("section4").Controls.Item("label41").Caption = scaption
    .Sections("section4").Controls.Item("label41").Width = reportwidth
    .Sections("section4").Controls.Item("label42").Width = reportwidth
    .Sections("section2").Controls.Item("line_2").Width = reportwidth
    .Sections("section2").Controls.Item("line2").Width = reportwidth
    .Sections("section1").Controls.Item("line1").Width = reportwidth
    .Sections("section2").Controls.Item("line20").Left = 0
    .Sections("section1").Controls.Item("line10").Left = 0
    End With'为section1,2区设置数据
    leftpos = 0
    For i = 0 To lst.ListCount - 1
    dtr.Sections("section2").Controls.Item("label1" & (i + 1)).Caption = lst.List(i)
    dtr.Sections("section2").Controls.Item("label1" & (i + 1)).Width = lst.ItemData(i)
    dtr.Sections("section2").Controls.Item("label1" & (i + 1)).Left = leftpos
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).DataField = lst.List(i)
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).Width = lst.ItemData(i)
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).Left = leftpos
    dtr.Sections("section2").Controls.Item("line2" & (i + 1)).Left = leftpos + lst.ItemData(i)
    dtr.Sections("section1").Controls.Item("line1" & (i + 1)).Left = leftpos + lst.ItemData(i)
    leftpos = leftpos + lst.ItemData(i)
    '特殊字段的格式特殊处理
    If lst.List(i) = "收盘价" Or lst.List(i) = "最低价" Or lst.List(i) = "最高价" Then
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).DataFormat.Format = "¥#,##0.00"
    End If
    If lst.List(i) = "涨跌" Then
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).DataFormat.Format = "#,##0.00"
    End If
    If lst.List(i) = "成交量" Then
    dtr.Sections("section1").Controls.Item("text1" & (i + 1)).DataFormat.Format = "#,##0"
    End If
    Next i'对不用的text控件必须设置其datafield属性,如lst.List(0),否则出错,但一定让其不可见
    '其他不用的label,line控件同样均不可见
    i = lst.ListCount
    While i < (dtr.Sections("section1").Controls.Count - 10) 
    '10 为section1区域的非text控件的控件总数
    i = i + 1
    dtr.Sections("section1").Controls.Item("text1" & i).DataField = lst.List(0)
    dtr.Sections("section1").Controls.Item("text1" & i).Visible = False
    dtr.Sections("section2").Co