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

时间:2009-05-20 05:46:22

标签: asp.net reporting-services reportviewer reportingservices-2005

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

我们本来可以使用链接报告并隐藏适当的参数,但是第一个参数(它是多值的)有很多可能的组合,所以我们宁愿不这样做。相反,我们有一个控制第一个参数的ASP.NET ListBox,当它的选择被更改时,我们使用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()函数,如上所述)。即使使用这种简单的方案,隐藏/显示按钮在开发环境中也能正常工作,但我们在生产环境中仍然存在相同的问题(显示按钮不起作用)。我们还在生产环境中的网络上的另一台服务器上尝试了这个,我们遇到了同样的问题。所以在开发环境中一切似乎都运行良好,但在该环境之外的2个不同服务器上,我们似乎遇到了同样的问题。

Edit2:以下是测试报告页面背后的代码。该页面有一个ReportViewer,2个按钮和一个用于调试输出的标签。当显示隐藏参数不起作用时,Label甚至会在调用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

1 个答案:

答案 0 :(得分:0)

对于遇到此问题的其他人来说,这就是我们遇到此问题的原因:

问题是由于环境的不同。即使我们将ReportViewer DLL复制到项目的bin文件夹中(并因此复制到托管项目的位置),这个问题与params是旧版ReportViewer控件中的一个错误。您需要获取Microsoft Report Viewer Redistributable 2005 SP1来解决此问题。显然我们在开发环境中安装了此修复程序。出于某种原因,ReportViewer DLL在两端都是相同的版本。这可能是因为DLL实际上是从不同的位置访问的。