Vb.net 更改Crystal报告参数

Vb.net 更改Crystal报告参数,vb.net,crystal-reports,parameters,Vb.net,Crystal Reports,Parameters,使用Visual Basic、.NET 3.5(VS2008)编写应用程序。。。并在Crystal reports 2008中创建了报告。。。。一切正常。。。我用如下代码传递参数值 Dim SParams as new hashtable SParams.add(paramname1,paramvalue1) SParams.add(paramname2,paramvalue2) SParams.add(paramname3,paramvalue3) .... For Each Param As

使用Visual Basic、.NET 3.5(VS2008)编写应用程序。。。并在Crystal reports 2008中创建了报告。。。。一切正常。。。我用如下代码传递参数值

Dim SParams as new hashtable
SParams.add(paramname1,paramvalue1)
SParams.add(paramname2,paramvalue2)
SParams.add(paramname3,paramvalue3)
....
For Each Param As ParameterField In rep.ParameterFields
            If SParams.ContainsKey(Param.Name.ToUpper) Then
                rep.SetParameterValue(Param.Name, SParams(Param.Name.ToUpper))
            Else
                rep.SetParameterValue(Param.Name, Param.DefaultValues())
            End If
Next
... and it works fine...
当报表在运行时显示在报表查看器中时,我想更改一些参数值。。。用户应该能够修改这些值。我该怎么做?
类似于Crystal Reports designer预览。从CR预览可以更改值吗?

我过去解决此问题的一种方法是创建自己的“参数输入”屏幕,供用户指定自定义值。提交后,流程将运行自己的自定义查询,并将结果集注入Crystal报表。然后,报告只是作为数据的表示机制

这样做的好处是,您可以配置Crystal Report以使用XSD源代码作为其数据模型,该模型充当数据外观的空框架。然后,在表单的代码隐藏中,您可以执行以下简单操作:

Dim crResults As New ReportDocument
Dim dtReportData As New DataTable

crResults.Load("PathToReport", OpenReportMethod.OpenReportByTempCopy)
dtReportData = RunStoredProcedure(ReportInfo.ProcedureName, ReportInfo.Parameters)
crResults.SetDataSource(dtReportData)
rep.SetParameterValue(Param.Name, Param.value)
rep.Refresh()
RP_Viwer.Refresh()

注意:RunStoredProcedure是我设置的一个自定义函数,用于调用存储过程并传入要绑定的参数哈希表,但您可以按任何方式滚动此函数,以获得存储结果的数据表。

我可能有错误的问题。看。。。 我已创建crystal报告文档(发票)。。。此文档有许多参数 t、 e.姓名、地址、电话、税率和其他。。。并已绑定到数据表,其中包括有关商品、数量、成本和其他信息。。。这一切都很好。。。这是我用这个代码做的

Dim rptobj As New rpt_Invoice ' my invoice sceleton
Using tblInvoice As New DataTable
'DataTable to bind
tblInvoice.Columns.Add("ANAME", GetType(String))
tblInvoice.Columns.Add("CNT", GetType(Double))
tblInvoice.Columns.Add("CNTSTR", GetType(String))
tblInvoice.Columns.Add("OUT_PR", GetType(Double))
For Each row As Datagridviewrow In rowCol
    Dim Drow As Data.DataRow = tblInvoice.NewRow
    Drow.Item("ANAME") = DBNullBug(row.Cells("ANAME").Value)
    Drow.Item("CNT") = row.Cells("DECCNT").Value
    Drow.Item("CNTSTR") = row.Cells("CNT").Value
    Drow.Item("OUT_PR") = row.Cells("SOLD_PR").Value
    tblInvoice.Rows.Add(Drow)
Next
'Params to pass 
Dim RPTParams As New Hashtable
RPTParams.Add("NDS", OPT.Item.NDSValue)
RPTParams.Add("INVOICENUM", "")
RPTParams.Add("INVOICEHIMQ", "")
RPTParams.Add("KATPASHT1", "Director")
RPTParams.Add("KATPASHT2", "Accountant")
RPTParams.Add("VCHPASHT1", "Director")
RPTParams.Add("VCHPASHT2", "Accountant")
RPTParams.Add("ADATE", CDate(Now))
RPTParams.Add("INFO", "")
RPTParams.Add("ORDER_ID", Order_Id)
Dlg_RepPreview.STable = tblInvoice
Dlg_RepPreview.SParams = RPTParams
Dlg_RepPreview.rep = rptobj
Dlg_RepPreview.ShowDialog()
End Using
名为“Dlg_RepPreview”的表单有rep变量(reportdocument)和STable(DataTable),SParams作为Hashtable(带有参数的Hashtable)

我在表单上写了这个代码

私有子Dlg_Rep_Load(ByVal sender作为对象,ByVal e作为System.EventArgs)处理Me.Load RP_Viwer.ReportSource=rep'RP_Viwer是我的ReportViewer 如果稳定不是什么,那么 rep.SetDataSource(稳定)'设置数据源 如果结束 对于rep.ParameterFields的set parametervalues中的每个Param As ParameterField 如果SParams.ContainsKey(Param.Name.ToUpper)那么 rep.SetParameterValue(Param.Name,SParams(Param.Name.ToUpper)) 其他的 rep.SetParameterValue(Param.Name,Param.DefaultValues()) 如果结束 下一个 反向振动放大(75) RP_Viwer.Refresh() 端接头

在这张表格里我有一个按钮。当用户单击该按钮时,打开对话框窗体,报告中包含所有参数和值(无数据源)。用户可以更改参数值(e.t.c地址、电话、名称),但数据源除外(e.t.c货物、数量、成本)。 我不能那样做。我尝试编写如下简单的代码:

Dim crResults As New ReportDocument
Dim dtReportData As New DataTable

crResults.Load("PathToReport", OpenReportMethod.OpenReportByTempCopy)
dtReportData = RunStoredProcedure(ReportInfo.ProcedureName, ReportInfo.Parameters)
crResults.SetDataSource(dtReportData)
rep.SetParameterValue(Param.Name, Param.value)
rep.Refresh()
RP_Viwer.Refresh()

但此代码不起作用…我该怎么办?

谢谢您的帮助…我得到了答案。。。这是密码

Private Sub SetParameters(ByVal Params As Hashtable)
    rep.DataDefinition.ParameterFields.Reset() ' rep is the ReportDocument
    ' rep.Refresh()
    For Each Param As ParameterField In rep.ParameterFields
        If Params.ContainsKey(Param.Name.ToUpper) Then
            rep.SetParameterValue(Param.Name, Params(Param.Name.ToUpper))
        Else
            rep.SetParameterValue(Param.Name, Param.DefaultValues())
        End If
    Next
    SetReport(rep)
End Sub

Public Sub SetReport(ByVal rpt As ReportDocument)
    RP_Viwer.Hide()
    RP_Viwer.ReportSource = rpt
    RP_Viwer.Zoom(75)
    RP_Viwer.Refresh()
    RP_Viwer.ShowLastPage()
    Lbl_TotalPageCount.Text = "/" & RP_Viwer.GetCurrentPageNumber()
    RP_Viwer.ShowFirstPage()
    RP_Viwer.Show()
End Sub

报告的数据源是什么。报表是否有从中提取数据的文本文件,或者是否连接到数据库?