我有一个 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