0

我有一个 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)。有什么想法可能是错的吗?任何解决方法的想法?如果您有任何问题,请发表评论。

编辑:经过进一步调查,我们进一步隔离了问题。我做了一个简单的报告,只有 1 个参数,没有任何数据库连接。然后我制作了一个带有 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
4

1 回答 1

0

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

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

于 2009-05-27T05:27:49.460 回答