急!!!在线等!如何将TextBox的值传到水晶报表中的参数字段中去?

syliulang 2006-04-23 02:36:56
如何将TextBox的值传到水晶报表中的参数字段中去?
...全文
977 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
edplrh2006 2006-12-18
  • 打赏
  • 举报
回复
mark!
edplrh2006 2006-12-18
  • 打赏
  • 举报
回复
mark!
syliulang 2006-04-24
  • 打赏
  • 举报
回复
大侠,谢谢了!
lbmshiwo 2006-04-24
  • 打赏
  • 举报
回复

三、参数字段运行时自定义(CrystalReportViewer)

参考:
设置参数 | Windows 窗体查看器的绑定选项 | Web 窗体查看器的绑定选项

可支持用户在 Crystal 报表中通过参数进行输入。这种参数有多种用途。例如:
使参数基于数据库字段并允许用户指定该字段的值,以便对报表中的数据进行筛选。
使用参数字段将条件格式应用于报表。
使用参数字段来定义排序顺序。
下列示例说明如何在运行时通过代码设置参数字段值。此例解释了如何设置两个不同的参数:第一个是多值离散参数,第二个是区域值参数。

在运行时修改参数字段

[Visual Basic]
' 声明将参数传递给
'查看器控件所需的变量。
Dim paramFields As New ParameterFields()
Dim paramField As New ParameterField()
Dim discreteVal As New ParameterDiscreteValue()
Dim rangeVal As New ParameterRangeValue()

' 第一个参数是具有多个值的离散参数。

' 设置参数字段的名称,它必须
'和报表中的参数相符。
paramField.ParameterFieldName = "客户姓名"

' 设置第一个离散值并将其传递给该参数
discreteVal.Value = "AIC Childrens"
paramField.CurrentValues.Add(discreteVal)

' 设置第二个离散值并将其传递给该参数。
' discreteVal 变量被设置为新值,这样,以前的设置
'就不会被覆盖。
discreteVal = New ParameterDiscreteValue()
discreteVal.Value = "Aruba Sport"
paramField.CurrentValues.Add(discreteVal)

' 将该参数添加到参数字段集合。
paramFields.Add(paramField)

' 第二个参数为区域值。paramField 变量
'被设置为新值,这样,以前的设置就不会被覆盖。
paramField = New ParameterField()

' 设置参数字段的名称,它必须
'和报表中的参数相符。
paramField.ParameterFieldName = "客户 ID"

' 设置区域的开始值和结束值并将区域传递给该参数。
rangeVal.StartValue = 42
rangeVal.EndValue = 72
paramField.CurrentValues.Add(rangeVal)

' 将第二个参数添加到参数字段集合。
paramFields.Add(paramField)

' 将参数字段集合放入查看器控件。
crystalReportViewer1.ParameterFieldInfo = paramFields

crystalReportViewer1.ReportSource = "c:\reports\my report.rpt"

[C#]
// 声明将参数传递给
//查看器控件所需的变量。
ParameterFields paramFields = new ParameterFields ();
ParameterField paramField = new ParameterField ();
ParameterDiscreteValue discreteVal = new ParameterDiscreteValue ();
ParameterRangeValue rangeVal = new ParameterRangeValue ();

// 第一个参数是具有多个值的离散参数。

// 设置参数字段的名称,它必须
//和报表中的参数相符。
paramField.ParameterFieldName = "客户姓名";

// 设置第一个离散值并将其传递给该参数。
discreteVal.Value = "AIC Childrens";
paramField.CurrentValues.Add (discreteVal);

// 设置第二个离散值并将其传递给该参数。
// discreteVal 变量被设置为新值,这样,以前的设置
//就不会被覆盖。
discreteVal = new ParameterDiscreteValue ();
discreteVal.Value = "Aruba Sport";
paramField.CurrentValues.Add (discreteVal);

// 将该参数添加到参数字段集合。
paramFields.Add (paramField);

// 第二个参数为区域值。paramField 变量
//被设置为新值,这样,以前的设置就不会被覆盖。
paramField = new ParameterField ();

// 设置参数字段的名称,它必须
//和报表中的参数相符。
paramField.ParameterFieldName = "客户 ID";

// 设置范围的开始值和结束值并将该范围传递给
//该参数。
rangeVal.StartValue = 42;
rangeVal.EndValue = 72;
paramField.CurrentValues.Add (rangeVal);

// 将第二个参数添加到参数字段集合。
paramFields.Add (paramField);

// 将参数字段集合放入查看器控件。
crystalReportViewer1.ParameterFieldInfo = paramFields;

[C++]
// 声明将参数传递给
//查看器控件所需的变量。
ParameterFields* paramFields = new ParameterFields ();
ParameterField* paramField = new ParameterField ();
ParameterDiscreteValue* discreteVal = new ParameterDiscreteValue ();
ParameterRangeValue* rangeVal = new ParameterRangeValue ();

// 第一个参数是具有多个值的离散参数。
// 设置参数字段的名称,它必须
//和报表中的参数相符。
paramField->ParameterFieldName = "客户姓名";

// 设置第一个离散值并将其传递给该参数。
String* val = "AIC Childrens";
discreteVal->Value = val;
paramField->CurrentValues->Add (discreteVal);

// 设置第二个离散值并将其传递给该参数。
// discreteVal 变量被设置为新值,这样,以前的设置
//就不会被覆盖。
discreteVal = new ParameterDiscreteValue ();
val = "Aruba Sport";
discreteVal->Value = val;
paramField->CurrentValues->Add (discreteVal);

// 将该参数添加到参数字段集合。
paramFields->Add (paramField);

// 第二个参数为区域值。paramField 变量
//被设置为新值,这样,以前的设置就不会被覆盖。
paramField = new ParameterField ();

// 设置参数字段的名称,它必须
//和报表中的参数相符。
paramField->ParameterFieldName = "客户 ID";

// 设置范围的开始值和结束值并将该范围传递给
//该参数。
rangeVal->StartValue = __box(42);
rangeVal->EndValue = __box(72);
paramField->CurrentValues->Add (rangeVal);

// 将第二个参数添加到参数字段集合。
paramFields->Add (paramField);

// 将参数字段集合放入查看器控件。
crystalReportViewer1->ParameterFieldInfo = paramFields;

crystalReportViewer1->ExportReport();
lbmshiwo 2006-04-24
  • 打赏
  • 举报
回复
例子三:
目录:

一、解决方案一:报表数据访问使用推模型

二、解决方案二:记录选定公式运行时自定义

三、解决方案三:将参数合并到记录选定公式

----------------------------------

一、解决方案一:

报表数据访问使用推模型



需要开发人员编写代码以连接到数据库,执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集,并且将该对象传递给报表。该方法使您可以将连接共享置入应用程序中,并在 Crystal Reports 收到数据之前先将数据筛选出来。

----------------------------------

二、解决方案二:

记录选定公式运行时自定义



1、通过查看器控件传递选定公式

[Visual Basic]

Dim SelectFormula As String

SelectFormula = \{客户.去年销售额} > \ & textBox1().Text

crystalReportViewer1.SelectionFormula = SelectFormula

[C#]

string selectFormula;

selectFormula = \{客户.去年销售额} > \ + textBox1.Text;

crystalReportViewer1.SelectionFormula = selectFormula;

[C++]

String* selectFormula;

selectFormula->Concat

(\{客户.去年销售额} > \, textBox1->Text);

crystalReportViewer1->SelectionFormula = selectFormula;



2、通过报表对象传递选定公式

[Visual Basic]

Dim selectFormula As String

selectFormula = \{客户.去年销售额} > \ & textBox1().Text

Report.DataDefinition.RecordSelectionFormula = selectFormula

[C#]

string selectFormula;

selectFormula = \{客户.去年销售额} > \ + textBox1.Text;

Report.DataDefinition.RecordSelectionFormula = SelectFormula;

[C++]

String* selectFormula;

selectFormula->Concat

(\{客户.去年销售额} > \, textBox1->Text);

Report->DataDefinition->RecordSelectionFormula = selectFormula;



3、刷新相应的报表,方法是使用以下代码行结束这段代码:

CrystalReportViewer1.RefreshReport()

该公式得以更新,将使用新的最小值(上年度的销售额)。

----------------------------------

三、解决方案三:

将参数合并到记录选定公式



参数字段不必放入报表中即可在记录或组选定公式中使用。创建参数字段,然后像插入其他字段那样将其输入到公式中。



用公式进行记录选定

若要减少从数据库服务器传输的数据量并改善性能,请将参数字段直接合并到记录选定公式中。

下面的记录选定公式提请用户输入销售配额,并只显示去年销售额超过销售配额的所有客户。

{客户.去年销售额} > {?SalesQuota}



需要开发人员编写代码在运行时传递参数值……


例子四:
编程抑制显示图表示例代码(作者:海波.NET,更新:2003-10-21)

using CrystalDecisions.CrystalReports.Engine;

private const string REPORT_NAME = @"..\..\CrystalReportAnalysis.rpt";
private const string CHART_OBJECT_NAME = @"Graph2";

private void Form1_Load(object sender, System.EventArgs e)
{
report = new ReportDocument();
report.Load(REPORT_NAME);
report.Refresh();

crvChart.ReportSource = report;
}

private void btnChangeType_Click(object sender, System.EventArgs e)
{
ChartObject chart;

chart = GetChartObject(CHART_OBJECT_NAME);
chart.ObjectFormat.EnableSuppress = true;

crvChart.RefreshReport();
}

private ChartObject GetChartObject(string reportObjectName)
{
ChartObject chart;

// 按名称获取 ReportObject,将其转换为 ChartObject,
//并返回此对象。
chart = report.ReportDefinition.ReportObjects[reportObjectName] as ChartObject;
if (chart != null) return chart;
else return null;
}
------------------------------------------------

编程更改公式字段示例代码(作者:海波.NET,更新:2003-11-18)

using CrystalDecisions.CrystalReports.Engine;

namespace GMedicine
{
/// <summary>
/// FormGMedicine 的摘要说明。
/// </summary>
public class FormGMedicine : System.Windows.Forms.Form
{
private const string CR_PATH = @"..\..\RPTGMedicine.rpt";
private const string FORMULA_FIELD_NAME = @"Group";
private string[] FORMULA_FIELD_TEXT = {"{客户.国家和地区}", "{客户.城市}",
"{客户.联系人职位}", "{客户.地区}"};

private CrystalDecisions.Windows.Forms.CrystalReportViewer crvGMedicine;
private GMedicine.RPTGMedicine rptGMedicine;
private System.Windows.Forms.ComboBox cbxSelectGroup;

private void FormGMedicine_Load(object sender, System.EventArgs e)
{
LoadFormulaList();

crvGMedicine.ReportSource = rptGMedicine;

crvGMedicine.RefreshReport();
}

private void cbxSelectGroup_SelectedIndexChanged(object sender, System.EventArgs e)
{
FormulaFieldDefinition formulaField;

formulaField = GetFormulaField(rptGMedicine, FORMULA_FIELD_NAME);

formulaField.Text = cbxSelectGroup.SelectedItem.ToString();

crvGMedicine.RefreshReport();
}

private FormulaFieldDefinition GetFormulaField(ReportDocument Report, string formulaFieldName)
{
FormulaFieldDefinition formulaField;

// 按名称获取 FormulaFieldDefinition,
//并返回此对象。
formulaField = Report.DataDefinition.FormulaFields[formulaFieldName];
if (formulaField != null) return formulaField;
else return null;
}

private void LoadFormulaList()
{
foreach (string formula in FORMULA_FIELD_TEXT)
{
cbxSelectGroup.Items.Add(formula);
}
}
}
}

我的用C#来实现的(请参考)
1、把自动生成的FieldObject标题对象删除,换一个TextObject(从工具箱上拉一个)。
2、程序为:
TextObject myFieldTitleName;
myFieldTitleName=(TextObject)oRep.ReportDefinition.ReportObjects["Text10"];
myFieldTitleName.Text="说明文字";
一、CrystalReportViewer
通过 CrystalReportViewer.ParameterFieldInfo 属性……

1、CrystalReportViewer 成员
公共实例属性
ParameterFieldInfo(从 CrystalReportViewerbase 继承) ParameterFields。获取或设置参数字段集合。

二、ReportDocument
通过 ReportDocument.DataDefinition.ParameterFields 属性……

1、ReportDocument 成员
公共实例属性
DataDefinition DataDefinition。获取 DataDefinition 对象。

2、DataDefinition 成员
公共实例属性
ParameterFields ParameterFieldDefinitions。获取 ParameterFieldDefinitions 集合。




lbmshiwo 2006-04-24
  • 打赏
  • 举报
回复
'*crystal report 的使用示例
'*适用版本:9.0
'*制作人:马亚红
'*制作时间:2004年12月28日
'*情况:此为在水晶报表软件中制作报表(rpt文件)的调用方式
'*菜单->工程->引用->选择:
'*1、Crystal Reports 9 ActiveX Desioner Desion and Runtime Library
'*2、Crystal Reports 9 activeX Desioner Run Time Library
'*好多朋友有这个问题:报表显示后数据没有刷新,解决方法如下:
'*1、在报表的设计界面,菜单“文件”--》“选项”--》“建立报表”选项卡--》把“将数据与报表一起保存”前的勾去掉后保存即可
'*2、调用报表对象的DiscardSavedData方法
'*****************************************************************
Option Explicit
Dim Report As New CrystalReport1
Dim wjfilesys As FileSystemObject 'FSO 对象,用于文件操作
Dim WithEvents CrSecRH As Section '报表显示区对象
Dim capp As New CRAXDDRT.Application '报表集合对象
Dim carp As New CRAXDRT.Report '报表集合中的报表对象
Dim carsubp As New CRAXDRT.Report '报表集合对象中的子报表对象
Dim Pic2 As OLEObject '报表对象中的Ole对象
Dim mytxt As CRAXDRT.TextObject '报表对象中的Textbox对象


Private Sub Combo1_Change() '放大(缩小)比例
CRViewer91.Zoom (CInt(Combo1.Text))
End Sub



Private Sub Command1_Click() '显示第一页
CRViewer91.ShowFirstPage
End Sub



Private Sub Command10_Click() '打印报表
CRViewer91.PrintReport
End Sub

Private Sub Command11_Click()
CRViewer91.showclosebutton
End Sub

Private Sub Command2_Click() '刷新报表
CRViewer91.Refresh
End Sub

Private Sub Command3_Click() '显示上一页
CRViewer91.ShowPreviousPage
End Sub
Private Sub Command4_Click() '显示下一页
CRViewer91.ShowNextPage
End Sub

Private Sub Command5_Click() '显示最后一页
CRViewer91.ShowLastPage
End Sub

Private Sub Command6_Click() '在报表内容内搜索
If (txtSearch.Text <> "") Then
CRViewer91.SearchForText (txtSearch.Text)
End If
txtSearch.Text = ""
End Sub

Private Sub Command7_Click() '导入出PDF

Dim myExportFile As String
myExportFile = App.Path + "\temp.pdf"
If wjfilesys.FileExists(myExportFile) Then

wjfilesys.DeleteFile (myExportFile)
End If
Report.ExportOptions.DiskFileName = myExportFile
Report.ExportOptions.FormatType = crEFTPortableDocFormat
Report.ExportOptions.DestinationType = crEDTDiskFile
Report.ExportOptions.PDFExportAllPages = True
Report.Export (False)

End Sub

Private Sub Command8_Click() '导出到Excel
Dim myExportFile As String
myExportFile = App.Path + "\temp.xls"
If wjfilesys.FileExists(myExportFile) Then

wjfilesys.DeleteFile (myExportFile)
End If
Report.ExportOptions.DiskFileName = myExportFile
Report.ExportOptions.FormatType = crEFTExcel97
Report.ExportOptions.DestinationType = crEDTDiskFile
Report.ExportOptions.PDFExportAllPages = True
Report.Export (False)

End Sub

Private Sub Command9_Click() '导出到WORD
Dim myExportFile As String
myExportFile = App.Path + "\temp.doc"
If wjfilesys.FileExists(myExportFile) Then

wjfilesys.DeleteFile (myExportFile)
End If
Report.ExportOptions.DiskFileName = myExportFile
Report.ExportOptions.FormatType = crEFTWordForWindows
Report.ExportOptions.DestinationType = crEDTDiskFile
Report.ExportOptions.PDFExportAllPages = True
Report.Export (False)
End Sub

Private Sub Form_Load()
Screen.MousePointer = vbHourglass
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strsql As String
Dim i As Integer
If cn.State = adStateOpen Then cn.Close
'SQL SERVER连接方式
With cn
.Provider = "sqloledb"
.ConnectionString = "data source=dd;initial catalog=dfd;user id=sa;password=aaa"
.Open
End With
'Mdb的连接方式
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" + App.Path + "\Test.mdb;Persist Security Info=False"
.Open
End With

strsql = "select * from carsort"
If rs.State = adStateOpen Then rs.Close
With rs
.ActiveConnection = cn
.CursorLocation = adUseClient
.Open strsql, cn, adOpenDynamic, adLockOptimistic
End With

Set carp = capp.OpenReport(App.Path + "\CryStalTest.rpt") '取报表对象
Set carsubp = carp.OpenSubreport("myhgyp") '取子报表对象
Set CrSecRH = carp.Sections("PageHeaderSection1") '取报表头显示区对象
Set Pic2 = carp.Sections("PageHeaderSection1").ReportObjects("picture1") '取报表头显示区中的Ole对象
Set mytxt = CrSecRH.ReportObjects("mytxt")

For i = 1 To carp.Database.Tables.Count '设置报表的数据源
If carp.Database.Tables.Item(i).Name = "carsort" Then
carp.Database.Tables(i).SetDataSource rs
End If
Next
For i = 1 To carsubp.Database.Tables.Count '设置子报表的数据源
If carp.Database.Tables.Item(i).Name = "carsort" Then
carsubp.Database.Tables(i).SetDataSource rs
End If
Next
Screen.MousePointer = vbHourglass
'第一种设置参数的方式
carp.ParameterFields(1).ClearCurrentValueAndRange
carp.ParameterFields(1).AddCurrentValue ("myhgyp")
carp.ParameterFields(2).ClearCurrentValueAndRange
carp.ParameterFields(2).AddCurrentValue (CInt("3"))
'第二种设置参数的方式
carp.ParameterFields.GetItemByName("gg").ClearCurrentValueAndRange
carp.ParameterFields.GetItemByName("gg").AddCurrentValue ("myh11" & vbCrLf & "-2gyp")
carp.ParameterFields.GetItemByName("ff").ClearCurrentValueAndRange
carp.ParameterFields.GetItemByName("ff").AddCurrentValue (CInt("673"))
carp.DiscardSavedData
CRViewer91.ReportSource = carp
CRViewer91.ViewReport
Screen.MousePointer = vbDefault
CRViewer91.Zoom 100
'----------------------
Screen.MousePointer = vbDefault
Set wjfilesys = CreateObject("Scripting.FileSystemObject")
End Sub
Private Sub CrSecRH_Format(ByVal pFormattingInfo As Object) '格式化报表头显示区中的对象
Set Pic2.FormattedPicture = LoadPicture(App.Path & "\tsconfig.bmp") 'changes the pic in the Report Header
mytxt.SetText Format(mytxt.Text, "####年##月##日") '格式化TextBox中的文本显示方式
End Sub

Private Sub Form_Resize() '设置报表显示区域
CRViewer91.Top = 0
CRViewer91.Left = 0
CRViewer91.Height = ScaleHeight
CRViewer91.Width = ScaleWidth
End Sub

另外一例子:

Dim myReportDoc As New ReportDocument()
myReportDoc.Load(Application.StartupPath & "\CrystalReport1.rpt")

CType(myReportDoc.ReportDefinition.ReportObjects.Item("text1"), TextObject).Text = TextBox1.Text
CType(myReportDoc.ReportDefinition.ReportObjects.Item("text1"), TextObject).Width = 10000 'by Henry
Me.CrystalReportViewer1.ReportSource = myReportDoc
在VC中动态赋TEXT的内容的例子:

ITextObjectPtr ppp;
ISectionPtr pSection;
_bstr_t section("D");
pSection=m_Report->Sections->GetItem(section);
ppp=pSection->ReportObjects->Item["Text1"];
ppp->SetText("化验日期3");
LIANGQIAN1984 2006-04-24
  • 打赏
  • 举报
回复
我这里有个,你自己再改改就行了
CrystalDecisions.CrystalReports.Engine.ReportDocument myReportDoc=
new CrystalDecisions.CrystalReports.Engine.ReportDocument();
myReportDoc.Load(System.Windows.Forms.Application.StartupPath +"\\资产类别(明细)按年度统计.rpt");
CrystalDecisions.Shared.ParameterValues pvEnterpriseName=new CrystalDecisions.Shared.ParameterValues();
CrystalDecisions.Shared.ParameterDiscreteValue pdEnterpriseName=new CrystalDecisions.Shared.ParameterDiscreteValue();
//设置单位名称
pdEnterpriseName.Value="china";
pvEnterpriseName.Add(pdEnterpriseName);
myReportDoc.DataDefinition.ParameterFields["dwmc"].ApplyCurrentValues(pvEnterpriseName);

CrystalDecisions.Shared.ParameterValues pvDwmc=new CrystalDecisions.Shared.ParameterValues();
CrystalDecisions.Shared.ParameterDiscreteValue pdDwmc=new CrystalDecisions.Shared.ParameterDiscreteValue();
//设置金额单位代号
pdDwmc.Value="3";
pvDwmc.Add(pdDwmc);
myReportDoc.DataDefinition.ParameterFields["jedw"].ApplyCurrentValues(pvDwmc);

CrystalDecisions.Shared.ParameterValues pvEnterpriseCount=new CrystalDecisions.Shared.ParameterValues();
CrystalDecisions.Shared.ParameterDiscreteValue pdEnterpriseCount=new CrystalDecisions.Shared.ParameterDiscreteValue();
//设置单位数量
pdEnterpriseCount.Value="1010";
pvEnterpriseCount.Add(pdEnterpriseCount);
myReportDoc.DataDefinition.ParameterFields["dwsl"].ApplyCurrentValues(pvEnterpriseCount);

CrystalDecisions.Shared.ParameterValues pdDate=new CrystalDecisions.Shared.ParameterValues();
CrystalDecisions.Shared.ParameterDiscreteValue pvDate=new CrystalDecisions.Shared.ParameterDiscreteValue();
//设置日期
pvDate.Value="1198年10月12日";
pdDate.Add(pvDate);
myReportDoc.DataDefinition.ParameterFields["date"].ApplyCurrentValues(pdDate);
this.crystalReportViewer1.ReportSource=myReportDoc;
lbmshiwo 2006-04-24
  • 打赏
  • 举报
回复
要具体代码吗?我刚完成这东西
frenzy917 2006-04-24
  • 打赏
  • 举报
回复
private void Report()
{
CrystalReport1 CR = new CrystalReport1();
DataSet ds = new DataSet();
SqlConnection cn = new SqlConnection(connectionString----连接数据库的语句);
cn.Open();
SqlDataAdapter MyAdapter = new SqlDataAdapter("查询语句,这里写的时候可以带参数", cn);

MyAdapter.Fill(ds, "表的名称");
CR.SetDataSource(ds);
this.crystalReportViewer1.ReportSource = CR;

cn.Close();
}
syliulang 2006-04-23
  • 打赏
  • 举报
回复
请回复详细些!

4,818

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧