阿泰的软件实用主义

水晶报表/BOE

博客园 首页 新随笔 联系 订阅 管理
  213 Posts :: 10 Stories :: 4033 Comments :: 43 Trackbacks
 

本文的C#改进版本请参见:http://www.cnblogs.com/babyt/archive/2008/01/03/1024941.html

很多次被问到如下问题:
水晶报表能否做到由客户选择要显示的字段进行自定义显示?

我也迷惑了好久,后来还是仔细看了一海波的文章,终于有点眉目

如何在水晶报表中动态添加字段
http://blog.csdn.net/haibodotnet/archive/2003/11/09/21504.aspx
如何向 CrystalReportViewer 和 ReportDocument 传递参数
http://blog.csdn.net/haibodotnet/archive/2003/11/16/21516.aspx

实际操作了一下,没想象得那么困难.
开发环境: VS2003(VB.Net) + 水晶报表10高级专业开发版 + Win2003


要创建一个ADO.Net的水晶报表,具体过程我就不写了
看这里http://www.cnblogs.com/babyt/articles/118097.html

Step1: xsd文件结构
我们的表结构是这样子

有时候你并不是从数据库里取的一个完整表,那么你可以自己编辑这个xsd文件

有一点需要注意,这个文件里必须包含所有你将要显示的字段



Step2:下面我们开始创建模板

在这里,我加了6个字段,但是不要在报表上放置任何的数据字段。
新建立6个公式,名字取得别太好听,一定要按顺序来,如myField1,myField2..myField6
将公式依次放到详细资料节
删除自动产生的表头
新建立6个参数字段,同样,按顺序来,叫myParaField1,myParaField2..myParaField6

格式什么的这里就先不管了,咱们主要是先要实现功能。

Step3:程序设计
设计程序界面如下图所示,大家一下就看明白了,代码我写了详尽的注释,就不多说了。

'*************************************************************************
'
**模 块 名:CR_DefineFields
'
**说 明:Facesun.cn 版权所有2005 - 2006(C)
'
**创 建 人:Babyt(阿泰) http://www.cnblogs.com/babyt
'
**日 期:2005-04-20
'
**修 改 人:
'
**日 期:
'
**描 述:自定义字段显示报表
'
**版 本:V1.0.0
'
*************************************************************************
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System.Data
Imports System.Data.OleDb
Public Class Form1
Inherits System.Windows.Forms.Form
'查看CrystalReport1的定义可以查看对应的报表类
Dim crReportDocument As CrystalReport1

''ADO.NET Variables
Dim adoOleDbConnection As OleDbConnection
Dim adoOleDbDataAdapter As OleDbDataAdapter
Dim dataSet As dataSet

#Region " Windows 窗体设计器生成的代码 "

Public Sub New()
MyBase.New()

'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()

'在 InitializeComponent() 调用之后添加任何初始化

End Sub


'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub


'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer

'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents CheckBox1 As System.Windows.Forms.CheckBox
Friend WithEvents CheckBox2 As System.Windows.Forms.CheckBox
Friend WithEvents CheckBox3 As System.Windows.Forms.CheckBox
Friend WithEvents CheckBox4 As System.Windows.Forms.CheckBox
Friend WithEvents CheckBox5 As System.Windows.Forms.CheckBox
Friend WithEvents CheckBox6 As System.Windows.Forms.CheckBox
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents CrystalReportViewer1 As CrystalDecisions.Windows.Forms.CrystalReportViewer
Friend WithEvents Label1 As System.Windows.Forms.Label
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.CheckBox1 = New System.Windows.Forms.CheckBox
Me.CheckBox2 = New System.Windows.Forms.CheckBox
Me.CheckBox3 = New System.Windows.Forms.CheckBox
Me.CheckBox4 = New System.Windows.Forms.CheckBox
Me.CheckBox5 = New System.Windows.Forms.CheckBox
Me.CheckBox6 = New System.Windows.Forms.CheckBox
Me.Button1 = New System.Windows.Forms.Button
Me.CrystalReportViewer1 = New CrystalDecisions.Windows.Forms.CrystalReportViewer
Me.Label1 = New System.Windows.Forms.Label
Me.SuspendLayout()
'
'CheckBox1
'
Me.CheckBox1.Location = New System.Drawing.Point(24, 32)
Me.CheckBox1.Name = "CheckBox1"
Me.CheckBox1.Size = New System.Drawing.Size(48, 24)
Me.CheckBox1.TabIndex = 0
Me.CheckBox1.Text = "编号"
'
'CheckBox2
'
Me.CheckBox2.Location = New System.Drawing.Point(96, 32)
Me.CheckBox2.Name = "CheckBox2"
Me.CheckBox2.Size = New System.Drawing.Size(88, 24)
Me.CheckBox2.TabIndex = 1
Me.CheckBox2.Text = "材料名称"
'
'CheckBox3
'
Me.CheckBox3.Location = New System.Drawing.Point(184, 32)
Me.CheckBox3.Name = "CheckBox3"
Me.CheckBox3.Size = New System.Drawing.Size(64, 24)
Me.CheckBox3.TabIndex = 2
Me.CheckBox3.Text = "品牌"
'
'CheckBox4
'
Me.CheckBox4.Location = New System.Drawing.Point(264, 32)
Me.CheckBox4.Name = "CheckBox4"
Me.CheckBox4.Size = New System.Drawing.Size(56, 24)
Me.CheckBox4.TabIndex = 3
Me.CheckBox4.Text = "单价"
'
'CheckBox5
'
Me.CheckBox5.Location = New System.Drawing.Point(344, 32)
Me.CheckBox5.Name = "CheckBox5"
Me.CheckBox5.Size = New System.Drawing.Size(48, 24)
Me.CheckBox5.TabIndex = 4
Me.CheckBox5.Text = "数量"
'
'CheckBox6
'
Me.CheckBox6.Location = New System.Drawing.Point(424, 32)
Me.CheckBox6.Name = "CheckBox6"
Me.CheckBox6.Size = New System.Drawing.Size(80, 24)
Me.CheckBox6.TabIndex = 5
Me.CheckBox6.Text = "采购日期"
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(536, 32)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(64, 23)
Me.Button1.TabIndex = 6
Me.Button1.Text = "生成报表"
'
'CrystalReportViewer1
'
Me.CrystalReportViewer1.ActiveViewIndex = -1
Me.CrystalReportViewer1.DisplayGroupTree = False
Me.CrystalReportViewer1.Location = New System.Drawing.Point(16, 72)
Me.CrystalReportViewer1.Name = "CrystalReportViewer1"
Me.CrystalReportViewer1.ReportSource = Nothing
Me.CrystalReportViewer1.ShowGroupTreeButton = False
Me.CrystalReportViewer1.Size = New System.Drawing.Size(592, 344)
Me.CrystalReportViewer1.TabIndex = 7
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(16, 8)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(152, 16)
Me.Label1.TabIndex = 8
Me.Label1.Text = "选择要显示的字段"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(624, 445)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.CrystalReportViewer1)
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.CheckBox6)
Me.Controls.Add(Me.CheckBox5)
Me.Controls.Add(Me.CheckBox4)
Me.Controls.Add(Me.CheckBox3)
Me.Controls.Add(Me.CheckBox2)
Me.Controls.Add(Me.CheckBox1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)

End Sub


#End Region


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim ConnectionString As String = ""
Dim sqlString As String = ""
'保持字段的字符串
Dim FieldString As String = ""
'保持字段名称的数组
Dim FieldArray() As String
Dim i As Integer, j As Integer

'参数字段集合
Dim ParamFields As New ParameterFields
'参数字段
Dim ParamField As ParameterField
'离散值
Dim DiscreteVal As New ParameterDiscreteValue

'---------------------------------------------------------------------
'获取选取的字段并进行处理
'此处写的比较笨拙,用控件数组更方便
If CheckBox1.Checked = True Then
FieldString
= CheckBox1.Text
End If
If CheckBox2.Checked = True Then
FieldString
= FieldString & "," & CheckBox2.Text
End If
If CheckBox3.Checked = True Then
FieldString
= FieldString & "," & CheckBox3.Text
End If
If CheckBox4.Checked = True Then
FieldString
= FieldString & "," & CheckBox4.Text
End If
If CheckBox5.Checked = True Then
FieldString
= FieldString & "," & CheckBox5.Text
End If
If CheckBox6.Checked = True Then
FieldString
= FieldString & "," & CheckBox6.Text
End If
If FieldString = "" Then
MessageBox.Show(
"请选择要显示的字段")
Exit Sub
End If
'删除第一个逗号,使字串最终显示为 "字段1,字段2,字段3"
If FieldString.Substring(0, 1) = "," Then
FieldString
= FieldString.Substring(1, FieldString.Length - 1)
End If
'分割成数组,每个元素为一个字段名称
FieldArray = FieldString.Split(",")

'---------------------------------------------------------------------
'数据获取与组织部分
'以下为数据获取段,你可以根据自己的实际情况任意更改数据获取方式
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\BBT_Crystal.mdb"

''打开数据库联接
adoOleDbConnection = New OleDbConnection(ConnectionString)

''Sql语句
'sqlString = "Select * From 材料采购明细"
sqlString = "Select " & FieldString & " From 材料采购明细"

''执行语句
adoOleDbDataAdapter = New OleDbDataAdapter(sqlString, adoOleDbConnection)

''创建Dataset实例
dataSet = New DataSet
''填充dataSet
adoOleDbDataAdapter.Fill(dataSet, "材料采购明细")

'---------------------------------------------------------------------
''创建一个强类型报表实例
crReportDocument = New CrystalReport1
''crReportDocument.Database.Tables("材料采购明细").SetDataSource(dataSet)

'开始以数组为依据依次顺序设置表头和公式字段
For i = 0 To UBound(FieldArray)
'设置第一个离散值并将其传递给该参数
'传递参数做为表头
'--------------------------------------
'参数设置部分
ParamField = New ParameterField
ParamField.ParameterFieldName
= "myParaField" & (i + 1).ToString
'离散值
DiscreteVal = New ParameterDiscreteValue
DiscreteVal.Value
= FieldArray(i)
'赋值
ParamField.CurrentValues.Add(DiscreteVal)
'将该字段加如到字段集合中
ParamFields.Add(ParamField)
'不允许该字段弹出提示
ParamField.AllowCustomValues = False

'将公式绑定到具体字段
crReportDocument.DataDefinition.FormulaFields("myField" & (i + 1).ToString).Text = "{材料采购明细." & FieldArray(i) & "}"
Next

'设置剩余的未使用到的参数,防止出现提示
'具体操作同上,只是给一个空值
For j = i + 1 To 6
'设置第一个离散值并将其传递给该参数
'传递参数做为表头
ParamField = New ParameterField
ParamField.ParameterFieldName
= "myParaField" & (j).ToString
ParamFields.Add(ParamField)
DiscreteVal
= New ParameterDiscreteValue
DiscreteVal.Value
= ""
ParamField.CurrentValues.Add(DiscreteVal)
ParamFields.Add(ParamField)
ParamField.AllowCustomValues
= False
Next
'将参数字段集合绑定到浏览器
CrystalReportViewer1.ParameterFieldInfo = ParamFields

''将Dataset传递给报表
crReportDocument.SetDataSource(dataSet)

''将报表传递给浏览器
CrystalReportViewer1.ReportSource = crReportDocument
End Sub

End Class

 


运行结果

在这里下载完整代码
http://files.cnblogs.com/babyt/CR_DefineFields.rar

后记1:
你可以对该例增加字段显示的先后顺序排列功能
后记2:
2005年4月21日在wp的帮助下实现格线表现方式,见
http://www.cnblogs.com/babyt/articles/142908.html
后记3:
2008年1月3日
本文的C#改进版本请参见:http://www.cnblogs.com/babyt/archive/2008/01/03/1024941.html
-------Over------------------
希望这篇文章对你有所帮助。
阿泰 20050420

posted on 2005-04-21 01:38 阿泰 阅读(29990) 评论(77) 编辑 收藏

Feedback

#1楼 2005-04-21 12:42 wp
在Web上试验了一下,感觉很好
表格确实不好做,困惑中

 回复 引用   

#2楼 2005-04-21 17:12 wp
表格做出来了,不过有一点间隔
参考了海波的文章:
用对象边框模拟表格的框线
http://blog.csdn.net/haibodotnet/archive/2003/12/25/21548.aspx

 回复 引用   

#3楼[楼主] 2005-04-21 17:22 阿泰      
非常感谢wp,我直接都没往这个方面想,呵呵。思维定势了

我现在试验不了,你这样试试看行不行

最左边第一个字段画一个完整的边框
其余的字段全部只画三个部分,就是上、下、右
左边不画,空着,拖动这个字段压在前一个字段的右边线上

如果该字段是数值的,自然靠右,没问题
如果是非数值的,因为默认靠左,会压在前一字段的右格线上
所以这个字段在给值的时候,在前面加一个或者两个空格

 回复 引用 查看   

#4楼[楼主] 2005-04-21 17:47 阿泰      
好象反一下,用左边去压右边更好。
 回复 引用 查看   

#5楼[楼主] 2005-04-21 18:01 阿泰      
呵呵,原来是这样
1:首先将所有的公式加上边线(四边都要)
2:
设置前N-1个公式的格式中右边的边线公式为
如果下一个公式为空,则显示该边线
如对第5个公式,设置其边线控制公式为:

if {@myField6}="" then
1
else
0

只是线太粗了,,不能象line一样设置线形宽度,继续看看

 回复 引用 查看   

#6楼 2005-04-22 09:25 wp
线之间还是有点空隙,不知道还有其他办法没有 :(

一般使用这种报表,都是因为字段太多,报表显示不下。如果这样设计的话,需要在设计时给每个字段安排位置,我觉得有点弊端。能否在设计时给字段指定较小的列宽,而在运行时由代码指定其列宽和位置呢?

 回复 引用   

#7楼 2005-04-22 11:38 大猫
阿泰, 如果用户要增加列 怎么办啊? 上面例子的情况是已经知道有这么多列了! 如果要增加一个新的列呢
 回复 引用   

#8楼 2005-06-11 16:28 八两金      
如果你要新增一列的话就要在报表中先增加啦.
它是无法在程序运行中进行新增的.除非你有可创建的许可证.要不就不行.

 回复 引用 查看   

#9楼 2005-07-28 15:26 bing [未注册用户]
请问阿泰,可能用这个动态字段生成的图表吗?
 回复 引用   

#10楼 2005-07-29 10:17 ask[未注册用户]
阿泰,问你个问题,上面你是实现了任意选择指定字段显示了,可是我现在想要任意字段能够居中显示,该怎么做呢?顺便说一下,你提供下载的源代码最后一个采购日期有点问题,如果单独选择它,可以运行,如果选择任意字段和它配合一起显示,就会出现问题!
 回复 引用   

#11楼 2005-07-30 15:12 ask[未注册用户]
阿泰,你是不是忙不过来了呢?
 回复 引用   

#12楼 2005-07-30 21:59 光明[未注册用户]
我想问一下有没有在VB中实现这种功能的代码呢,谢谢了
 回复 引用   

#13楼 2005-08-15 16:05 jj[未注册用户]
我有一问题,如果公式的值为日期类型就会显示到 时分,如果想去掉时分部分,应该如何做呢?

请大家帮帮忙了,先谢谢了!

 回复 引用   

#14楼[楼主] 2005-08-15 16:44 阿泰      
在你的返回值外面加个 date
如 date(CurrentDateTime)

 回复 引用 查看   

#15楼 2005-08-15 16:56 jj[未注册用户]
不好意思,但是如何判断该公式的值是日期类型呢?
是不是在水晶报表的公式编辑器里输入语句呢?

 回复 引用   

#16楼[楼主] 2005-08-15 18:34 阿泰      
t2:

if isdate(cstr({@t1})) then
date({@t1})

 回复 引用 查看   

#17楼 2005-08-16 12:02 jj[未注册用户]
不知道为什么,这个语句 if isdate(cstr({@t1})) then 为什么没有启作用呢!
我的是Microsoft Visual Basic .NET 2003及自带的Crystal Reports for Visual Studio .NET。

 回复 引用   

#18楼[楼主] 2005-08-16 13:38 阿泰      
我用9.2和10都可以的,你把模板发给我看看吧
babyt#mail.csdn.net
#==>@

 回复 引用 查看   

#19楼 2005-08-23 14:10 途中[未注册用户]
阿泰

我用的是C#,怎麼按你的這種方法不能成功呢
出現了這樣的錯誤
錯誤: 公式 <myField01>. 'ShortCode' 其他文字似乎不是公式的一部分。 中發生錯誤

 回复 引用   

#20楼 2005-09-16 15:18 nedtwo[未注册用户]
:请问,您描述的过程,适应【CRYstal Repoty9中文版】吗?,我的运行环境为:XP(sp2),SQL Server2000,VB6.0 .我查了查“没有找到-强类型报表”,想弄个明白?
谢谢!。。。。。。代码我写了详尽的注释,就不多说了。。。。。,部分作为VB应做何修改?!?!2005-09-15 email_no:nedtwo@sohu.com

 回复 引用   

#21楼 2005-09-16 15:20 nedtwo[未注册用户]
阿泰:请问,您描述的过程,适应【CRYstal Repoty9中文版】吗?,我的运行环境为:XP(sp2),SQL Server2000,VB6.0 .我查了查“没有找到-强类型报表”,想弄个明白?
谢谢!。。。。。。代码我写了详尽的注释,就不多说了。。。。。,部分作为VB应做何修改?!?!2005-09-15 email_no:nedtwo@sohu.com

 回复 引用   

#22楼 2005-09-19 16:41 nedtwo[未注册用户]
阿泰:你好!请有空关照一下,我的帖子,谢谢!!2005-09-19
......您描述的过程,适应【CRYstal Repoty9中文版】吗?,我的运行环境为:XP(sp2),SQL Server2000,VB6.0 .我查了查“没有找到-强类型报表”,想弄个明白?
谢谢!【原文:。。。。。。代码我写了详尽的注释,就不多说了。。。。。,】部分作为VB应做何修改?!?!2005-09-19 email_no:nedtwo@sohu.com

 回复 引用   

#23楼 2005-09-25 14:45 nedtwo[未注册用户]
:阿泰:你好!请有空关照一下,我的帖子,谢谢!!2005-09-25
请说上一两句。3Q!

 回复 引用   

#24楼 2005-10-27 14:33 whh[未注册用户]
阿泰:你好!
我在用报表动态分组时,老会出现,if {?parainfo} = "Opportunity Name" then {OpportunityPipeline.OpportunityName}字段名未知的错误 . 可{?parainfo}的值就是
"Opportunity Name"?

 回复 引用   

#25楼 2005-10-28 10:36 snmfk[未注册用户]
你好:
怎么我运行的时修提示:
CrystalDecisions.CrystalReports.Engine.InvalidArgumentException¡±ÀàÐ͵ÄÒì³£³öÏÖÔÚ crystaldecisions.crystalreports.engine.dll 异常
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\temp_4642dd0c-ed50-49cf-9955-0e5a957cbcdf.rpt 出错
无效的表号?

 回复 引用   

#26楼 2005-10-28 11:40 snmfk[未注册用户]
看了你的源程序,我知道自已错在哪里了,谢谢!阿t
 回复 引用   

看了,然后学着用WEB形式做了一个,很有启发,谢谢了!
 回复 引用   

看了,然后学着用WEB形式做了一个,很有启发,谢谢了!
 回复 引用   

#29楼 2005-11-29 14:40 兜兜[未注册用户]
看了你的代码后我试用asp.net+c#做了个web版本,但是不知道为什么出现“丢失参数字段当前值”的错误,
异常详细信息: CrystalDecisions.CrystalReports.Engine.ParameterFieldCurrentValueException: 丢失参数字段当前值。
如果达人知道原因告诉我一下可以么?
我的msn:xiaoxiaodou_1983@hotmail.com
焦急万分中~~~~

 回复 引用   

请教一下怎样在水晶报表中画斜线?谢谢!
 回复 引用   

#31楼 2005-12-13 14:19 力量[未注册用户]
我用C#+.net自带的报表工具,提示也是无效的表号,请问要怎么解决?
 回复 引用   

请问一下,如何将数据字段动态的绑定到图表来显示分析,也就是说我数据集中的分析字段id,name,data1,data2....data10... 中的data的列数是没有固定的,可能有很多个分析字段,而我想把它们绑定到曲线图或柱图中进行数据分析,请问一下该如何动态的绑定?谢谢
 回复 引用   

#33楼 2006-03-11 14:28 ask[未注册用户]
阿泰,请问一个问题,你这里可以做到任意选择指定字段了,但是能不能够每次都让他们显示满整个报表?我的意思就是:不管现实多少个字段,字段宽度总和刚好是报表的宽度,也就是说字段的宽度是可变的。这样怎么做呢?谢谢
 回复 引用   

阿泰,你好,请教一个问题,开发环境: VS2003(C#.Net) + 水晶报表9专业开发版(Crystal Reports 9) + Win2000 我在Crystal Reports 9中创建一个报表,直接到.Net中用CrystalReportViewer控件显示,数据显示 出来,但只要我将该报表在.Net中打开,重新指定数据源(仅字段定义),数据就能显示出来,请问这正常吗?谢谢!!

 回复 引用   

支持crystal reports 的条码.NET 组件.QQ:191999470
 回复 引用   

#36楼 2006-04-06 10:46 zouyan[未注册用户]
你好,“在水晶报表中实现任意选择指定字段显示 ”有java版的吗??
 回复 引用   

#37楼 2006-04-07 13:41 YSY[未注册用户]
我想问一下,阿泰,如何将程序中设定的查询条件,传递到报表中,并在报表中显示?

比如, 设定查询条件 为 日期: 2006-03-01 ~ 2006-04-01 , 如何将该日期赋给一个text呢?

 回复 引用   

#38楼 2006-04-14 10:24 YTB[未注册用户]
我想问一下,如果报表字段太多,在设计时无法排列,那该怎么办呢?
 回复 引用   

你好,“在水晶报表中实现任意选择指定字段显示 ”有VC版的吗??急需,先行谢过!以前做过水晶报表的一些工程,但是这个问题是我一直想做的!
 回复 引用   

经过我不懈的努力,vc版的“在水晶报表中实现任意选择指定字段显示 ”已经实现,不过,还是谢谢阿泰和海波兄的相关文档,让我受益匪浅!再次向你们这些大拿们表示感谢!以后有机会大家出来聊聊。
 回复 引用   

请问何时能看到VC版的呀?
 回复 引用   

激切的期待中!正在为学习水晶报表,问题多多,困惑多多,期待你的VC版。
 回复 引用   

#43楼 2006-05-24 14:31 北回归线      
我在交叉表最底端或是上端用线条工具增加一条新框,在编译运行后,出现了增加的新框长度要比交叉表的表格线条短。我想询问您水晶报表里的线条可以合并吗?这样我心加框的长度就能和交叉表展现的长度一样了~ 谢谢你的帮忙。
 回复 引用 查看   

@永远的宠儿
你好,你WEB型做了吗,能否给偶参考一下呢?谢谢

 回复 引用   

#45楼 2006-05-31 16:11 huazi[未注册用户]
我在c#里写了这样一段代码:
OracleConnection conn = new OracleConnection(connstr);
conn.Open();
OracleDataAdapter dr = new OracleDataAdapter(commstr,connstr);
DataSet myDataSet = new DataSet();
OracleCommand cmd = new OracleCommand(commstr, conn);
OracleDataReader odr = cmd.ExecuteReader();
dr.Fill(myDataSet, "wwww");
orpt.Load("C:\\Report1.rpt");
ParameterFields paramFields = new ParameterFields();
while (odr.Read())
{ ParameterField paramField = new ParameterField();

ParameterDiscreteValue discreteVal = new ParameterDiscreteValue();

discreteVal.Value = odr[1].ToString();
paramField.CurrentValues.Add(discreteVal);
paramField.Name = "PARAMNAME";
paramField.AllowCustomValues = false;
paramFields.Add(paramField);
}
this.crystalReportViewer1.ParameterFieldInfo = paramFields;
this.crystalReportViewer1.ReportSource = orpt;
this.crystalReportViewer1.ShowPreviousPage();
我在水晶报表的DETAILS里设置参数“PARAMNAME”,预览结果只是最后以行记录,我想显示多行。请问该如何做?
谢谢恢复!

 回复 引用   

#46楼 2006-06-21 15:06 ???[未注册用户]
阿泰 假如我的以后字段是要显示数据库中的图片二进制的呢...
而对于上面的:crReportDocument.DataDefinition.FormulaFields("myField" & (i + 1).ToString).Text = "{Categories." & FieldArray(i) & "}"

是一个Text型的.......??求救

 回复 引用   

将公式绑定到具体字段
crReportDocument.DataDefinition.FormulaFields("myField" & (i + 1).ToString).Text = "{材料采购明细." & FieldArray(i) & "}"
这句话,改成C#的怎么写?

 回复 引用   

#48楼 2006-08-03 16:59 五[未注册用户]
请教
在 V B 中 代码 怎改 啊?
好像 海波的 也没有

 回复 引用   

#49楼 2006-08-12 10:17 YMZ[未注册用户]
请人帮忙下
我们老师要在水晶报表里不用报表专家
自己写代码将要显示的东西显示出来
请问代码怎么写
期待中

 回复 引用   

请问一下为什么是你的PageHeader是myParaField1,而Details是@myField1,能否解释清楚
 回复 引用   

#51楼 2006-09-29 03:29 佚名      
阿泰。你的文章非常好。看了真的非常实用。我是初学者。我想问一下。在C/Sv发布水晶报表。是不是超过五个用户了。就用版权的问题了。
 回复 引用 查看   

请问有人有水晶报表10的中文破解版?
如果有可以给我一个吗 ,
email:wxm077@hotmail.com

 回复 引用   

真烦,我用了数据源还是一直出现提示要登陆DataSet数据库的页面,晕!~
 回复 引用   

#54楼 2007-01-11 23:04 大胖[未注册用户]
阿泰先生,我下載了你做的完整代碼 ,但是我卻無法執行。

程式停在這一行
adoOleDbDataAdapter.Fill(dataSet, "材料采购明细")
並有解釋說
無值提供給一或多個必要參數。
請問這是什麼意思?

我的環境是環境: VS2005跟內附的水晶報表,而作業系統是server2003。

請阿泰先生可以的話,幫我解決一下這個問題,謝謝。

 回复 引用   

#55楼 2007-04-25 15:02 wen[未注册用户]
我在显示字段头的时候,为何都只显示最后一个字段头呢,其他正常,还有老要我输入离散值,咳~~~~,我的是c#,可以得话发个邮件给我吧

wu_ernan@yahoo.com.cn

 回复 引用   

#56楼 2007-04-25 15:17 wen[未注册用户]
ParamFields.Add(ParamField)


这语句我看了下,怎么变成替代了呢,导致我都只显示最后一个表头,并且其他的表头要求我输入离散值

 回复 引用   

#57楼 2007-05-31 10:22 冰[未注册用户]
CRV_2.DataDefinition.FormulaFields["RF4"].Text="小明" ;

会出现
The remaining text does not appear to be part of the formula. Details: errorKind Error in File C:\DOCUME~1\WYP1\ASPNET\LOCALS~1\Temp\{DCEC2C31-F218-4AF9-85F2-E2AD7F6A8A10}.rpt: Error in formula <RF4>. '小明' The remaining text does not appear to be part of the formula. Details: errorKind

帮忙一下
wyp0623@sina.com



 回复 引用   

别写了,阿t不在了
 回复 引用   

#59楼 2007-07-21 09:14 破曉之陽      
真不錯。
 回复 引用 查看   

#60楼 2007-09-06 17:17 最后一滴血      
这个挺好!我收藏了!!!!!!!
 回复 引用 查看   

@最后一滴血
您好 你也在研究水晶报表?我想和你联系问个问题

 回复 引用   

请问有C#版本的吗?
要是有就更好了
VB到C#的语法不了解啊

 回复 引用   

#63楼 2008-01-03 11:19 力争[未注册用户]
阿泰 请问一下《在水晶报表中实现任意选择指定字段显示》这个有C#的例子么 我用的是水晶报表12 中文版的 在C#里边怎么实现那自选显示功能 谢谢啊
 回复 引用   

#64楼[楼主] 2008-01-03 19:23 阿泰      
@力争
请参考
http://www.cnblogs.com/babyt/archive/2008/01/03/1024941.html

 回复 引用 查看   

#65楼 2008-02-25 16:48 shimmy[未注册用户]
你好!
我用C#做的,是WEB的,ReportDoc.DataDefinition.FormulaFields["myField" + (i + 1).ToString()].Text = "{student." + FieldArray[i] + "}";
这句话出现了无效的索引。请问这是什么问题啊!

 回复 引用   

#66楼[楼主] 2008-02-25 18:13 阿泰      
@shimmy

请看一下这篇~~
http://www.cnblogs.com/babyt/archive/2008/01/03/1024941.html

 回复 引用 查看   

#67楼 2008-02-26 10:11 shimmy[未注册用户]
阿泰:
你好,请问你的公式字段是怎么写的,我定义了一个STUDENT表,利用水晶报表动态从里边取数据,可是ReportDoc.DataDefinition.FormulaFields["myField" + (i + 1).ToString()].Text = "{student." + FieldArray[i] + "}";这句话老是显示错误为无效的索引,我是直接添加的数据字段。没有用公式字段。不知道与公式字段有关系没。

 回复 引用   

#68楼[楼主] 2008-02-26 11:28 阿泰      
@shimmy

当然有关系了,呵呵。

公式的名称就是 myField1,myFiled2,内容为空,啥也不用填。

如果你是固定字段,根本就不用这种方式啊。。 要注意对应填写。
而且应该用你自己的数据库字段名,不是用公式名

 回复 引用 查看   

您好:请问
oRp.DataDefinition.FormulaFields["mf" + (i + 1).ToString()].Text = "{"+ds.Tables[0]+"." + FieldArray[i] +"}" ;

这句话怎么总是显示字段名无效啊.

 回复 引用   

#70楼[楼主] 2008-04-10 16:14 阿泰      
@anlinhai
debug 一下
"mf" + (i + 1).ToString()
ds.Tables[0]+"." + FieldArray[i]
看两者是否都存在

 回复 引用 查看   

@阿泰
存在,就是一直都这个异常..断点能看到查出来的字段...

 回复 引用   

恩,好了.谢谢了.
 回复 引用   

有决有VB加水晶报表的动态查询例子???????/
 回复 引用   

#74楼[楼主] 2008-09-08 17:28 阿泰      
@vintager(73楼)
如果你说的vb是vb6的话,那么
这篇的后半部分(dataset)结合
http://www.cnblogs.com/babyt/archive/2005/03/11/116878.html

http://www.cnblogs.com/babyt/archive/2005/03/11/116880.html
中的ttx方式即可。
我用得都是基本的操作,没有什么特殊用法,所以看vb.net基本上就是在看 vb6了


 回复 引用 查看   

#75楼 2009-05-22 11:31 2[未注册用户]
可以动态更改字段的显示的宽度吗?
 回复 引用   

#76楼 2010-11-15 11:52 阿宝QQ      

我安装你思路作了个web的怎么数据没有出来呀?也没有报错

 回复 引用 查看   

#77楼 2011-02-09 17:14 xx521      
水晶报表中一个表格行中,显示一个字段数据,数据太多,需要全部显示。勾选可以增大属性后,全部显示了,但这时会导致分页,(之前在控件<CR:CrystalReportViewer/>中屏蔽了水晶报表工具栏DisplayToolbar="False",加了 SeparatePages="false"保障显示的时候显示所有的页 ),这样显示的时候,可以看到每页中所有的数据,但是在导出word格式后,页的底部会有部分内容不显示,感觉字体大了,word显示不全了。这中情况咋整啊。

补充:导出成word后,字段数据在第1页没显示完,到了第2页继续显示,但是到了第2页只显示大部分(第2页的最下面是空白),再到第3页继续显示,同样第3页也只显示大部分,后面的页也都是:每页只显示大部分,其它地方是空白
中间页(不是第一页和最后一页),中的图文框,填充不了整个页面(导出后的数据都放在图文框中的)。你还得拉一下图文框猜能显示全。

问题2.把字段拖到报表中指定位置,任何拉大和表格框一样宽,这个字段是显示数据的,浏览报表的时候,这个内容要是多的时候,超过一行,它会提前换行,这个一行还没有显示到头呢就换行了,因为之前字段已经拉的和表格框一样宽了,还有这个字段不管是拉多大,它在显示的时候,一行都不显示到头,就提前换行了,不知道怎么回事。高手给说说呗!

 回复 引用 查看