尝试在ASP.NET ReportViewer控件中显示/隐藏参数时出现问题

尝试在ASP.NET ReportViewer控件中显示/隐藏参数时出现问题,asp.net,reporting-services,reportviewer,reportingservices-2005,Asp.net,Reporting Services,Reportviewer,Reportingservices 2005,我有一个在ASP.NET ReportViewer控件中向用户显示的SSRS报告。报表有许多参数,我们使用ReportViewer控件提供的参数提示。根据报表的某个参数,我们只需要提示用户输入其余报表参数的子集 我们可以使用链接报告并隐藏适当的参数,但是第一个参数有许多可能的组合(它是多值的),所以我们不希望这样做。相反,我们有一个ASP.NET列表框来控制第一个参数,当它的选择被更改时,我们使用ReportViewer.ServerReport.SetParameters()函数来隐藏/显示参

我有一个在ASP.NET ReportViewer控件中向用户显示的SSRS报告。报表有许多参数,我们使用ReportViewer控件提供的参数提示。根据报表的某个参数,我们只需要提示用户输入其余报表参数的子集

我们可以使用链接报告并隐藏适当的参数,但是第一个参数有许多可能的组合(它是多值的),所以我们不希望这样做。相反,我们有一个ASP.NET列表框来控制第一个参数,当它的选择被更改时,我们使用ReportViewer.ServerReport.SetParameters()函数来隐藏/显示参数(它接受一个ReportParameter数组,ReportParameter构造函数接受一个布尔值来隐藏/显示参数)

问题就在这里。在我们的开发环境中,一切正常。当我们将报表和ASP.NET站点部署到生产环境时,调用这些SetParameters()调用时,永远不会显示参数。我们知道调用了代码,因为我们放置了一些调试输出以确保。隐藏参数的代码工作正常。只是应该导致某些参数再次显示的代码不起作用。它不仅不会显示参数提示,而且参数的Visible属性也不会设置为true(通过使用ReportViewer.ServerReport.GetParameters()进行检查)

我们在这两种环境中都安装了SQL Server 2005 SP3,以及相同版本的报表查看器控件(Microsoft.ReportViewer.WebForms.dll)。有什么想法吗?有解决办法吗?如果你有问题,请留下评论

编辑:经过进一步调查,我们进一步隔离了问题。我做了一个简单的报告,只有一个参数,没有任何数据库连接。然后我制作了一个带有2个按钮的aspx页面和一个连接到该报告的ReportViewer控件。1按钮隐藏参数,1按钮显示参数(如上所述,使用SetParameters()函数)。即使在这个简单的场景中,隐藏/显示按钮在开发环境中也可以正常工作,但在生产环境中仍然存在同样的问题(显示按钮不工作)。我们还在生产环境中的网络上的另一台服务器上尝试了这种方法,我们也遇到了同样的问题。因此,在开发环境中,一切似乎都正常工作,但在该环境之外的两个不同服务器上,我们似乎遇到了相同的问题

Edit2:下面是测试报告页面的代码。该页面有一个ReportViewer、两个按钮和一个用于调试输出的标签。当隐藏参数的显示不起作用时,标签甚至在调用ShowParameter后显示Visible属性仍然为false

Public Partial Class TestReportPage
    Inherits System.Web.UI.Page

    Public Sub HideParameter(ByVal parameterName As String)
        Dim parameters As ReportParameterInfoCollection = ReportViewer1.ServerReport.GetParameters()
        ReportViewer1.ServerReport.SetParameters(New ReportParameter() {New ReportParameter(parameterName, GetParameterDefaults(parameterName, parameters), False)})
        parameters = ReportViewer1.ServerReport.GetParameters()
        lblTest.Text &= "Hide param " & parameterName & "; Is Visible: " & parameters(parameterName).Visible & "<br>"
    End Sub
    Public Sub ShowParameter(ByVal parameterName As String)
        Dim parameters As ReportParameterInfoCollection = ReportViewer1.ServerReport.GetParameters()
        ReportViewer1.ServerReport.SetParameters(New ReportParameter() {New ReportParameter(parameterName, GetParameterDefaults(parameterName, parameters), True)})
        parameters = ReportViewer1.ServerReport.GetParameters()
        lblTest.Text &= "Show param " & parameterName & "; Is Visible: " & parameters(parameterName).Visible & "<br>"
    End Sub
    Public Shared Function GetParameterDefaults(ByVal parameterName As String, ByVal parameters As Microsoft.Reporting.WebForms.ReportParameterInfoCollection) As String()
        Dim paramDefaults() As String = {}
        Dim i As Int16 = 0
        For Each paramValue As String In parameters(parameterName).Values
            ReDim Preserve paramDefaults(i)
            paramDefaults(i) = paramValue
            i = i + 1
        Next
        Return paramDefaults
    End Function
    Protected Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        HideParameter("foo")
    End Sub
    Protected Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ShowParameter("foo")
    End Sub
End Class
公共部分类TestReportPage
继承System.Web.UI.Page
公共子HideParameter(ByVal参数名称为字符串)
将参数设置为ReportParameterInfoCollection=ReportViewer1.ServerReport.GetParameters()
ReportViewer1.ServerReport.SetParameters(新的ReportParameter(){New ReportParameter(parameterName,GetParameterDefault(parameterName,parameters),False)})
parameters=ReportViewer1.ServerReport.GetParameters()
lblTest.Text&=“Hide param”¶meterName&”可见:“¶meters(parameterName)。可见(
” 端接头 公共子ShowParameter(ByVal parameterName作为字符串) 将参数设置为ReportParameterInfoCollection=ReportViewer1.ServerReport.GetParameters() ReportViewer1.ServerReport.SetParameters(新的ReportParameter(){New ReportParameter(parameterName,GetParameterDefault(parameterName,parameters),True)}) parameters=ReportViewer1.ServerReport.GetParameters() lblTest.Text&=“Show param”¶meterName&”可见:“¶meters(parameterName)。可见(
” 端接头 公共共享函数GetParameterDefault(ByVal parameterName作为字符串,ByVal参数作为Microsoft.Reporting.WebForms.ReportParameterInfo集合)作为字符串() Dim paramDefaults()作为字符串={} 尺寸i为Int16=0 对于参数(parameterName).Values中的字符串形式的每个paramValue 重拨保留参数默认值(i) 参数默认值(i)=参数值 i=i+1 下一个 返回参数默认值 端函数 受保护的子按钮1\u单击(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理按钮1。单击 HideParameter(“foo”) 端接头 受保护的子按钮2\u单击(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理按钮2。单击 ShowParameter(“foo”) 端接头 末级
对于任何其他曾经有过此问题的人,以下是我们出现此问题的原因:


问题是由于环境的不同。尽管我们将ReportViewer DLL复制到项目的bin文件夹中(并因此复制到项目所在的位置),但在早期版本的ReportViewer控件中,此问题和参数是一个bug。您需要使用Microsoft Report Viewer可再发行的2005 SP1来修复此问题。显然,我们在开发环境中安装了此修复程序。由于某些原因,ReportViewer DLL在两侧都是相同的版本。这可能是因为DLL实际上是从不同的位置访问的。

您是否有一些示例代码,说明如何从ASP.NET页面设置参数?也许是你的简单测试。我也遇到过类似的问题,但问题出在代码而不是报告上。我编辑了问题和测试ASP.NET页面的代码。