ASP.NET ReportViewer コントロールでユーザーに表示される SSRS レポートがあります。レポートには多くのパラメーターがあり、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) がインストールされています。何が間違っている可能性がありますか?回避策のアイデアはありますか? 質問がある場合は、コメントを残してください。
編集:さらに調査した結果、問題をさらに特定しました。DB 接続なしで 1 つのパラメーターだけで簡単なレポートを作成しました。次に、2 つのボタンとそのレポートに接続された ReportViewer コントロールを含む aspx ページを作成しました。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