我正在开发一个ASP.net应用程序,它允许用户从下拉列表中选择SSRS报告,填写报告参数,然后在下一页的ReportViewer中查看报告。一些参数具有有效值,我使用以下代码从RDLC文件中获取:
private ValidValue[] GetParameterValidValues(string parameterName, string reportDirectory)
{
ServerReport serverReport = new ServerReport();
string reportServerUrl = Application["ReportServerUrl"] as string;
serverReport.ReportPath = reportDirectory + lbReports.SelectedItem.Value;
serverReport.ReportServerUrl = new Uri(reportServerUrl);
ReportParameterInfo reportParameter = serverReport.GetParameters()[parameterName];
ValidValue[] validValues = reportParameter.ValidValues.ToArray();
return validValues;
}
然后将这些值添加到页面上动态创建的下拉列表中。
问题在于,在某些情况下,参数A可以过滤参数B的有效值。在ReportViewer控件中选择参数时,此功能可以是观察者。
我的问题是,如何在我的代码中实现此功能?
答案 0 :(得分:2)
每次选择另一个param所依赖的值时,您需要填充参数依赖项值。我发现的最佳解决方案是根据本文使用哈希表: http://www.codeproject.com/Articles/9161/SQL-Reporting-Services-Viewer-Page-Using-SOAP-API
在调用GetItemParameters的地方,循环遍历每个以检查它们是否具有依赖关系。然后将每个依赖项添加到哈希表中以便稍后设置值...
private ParameterValue[] _ParamDependenciesValues = new ParameterValue[0];
protected ItemParameter[] GetReportParameterDependencies()
{
ItemParameter[] Parameters = _Rs.GetItemParameters(_ThisReportPath, null, true, _ParamDependenciesValues, null);
if (Parameters.Length > 0)
{
foreach (ItemParameter p in Parameters)
{
if (p.Dependencies != null)
{
foreach (var d in p.Dependencies)
{
if (!_Dependencies.Contains(d))
{
_Dependencies.Add(d, null);
}
}
}
}
}
return Parameters;
}
然后,每次选择参数值时,您需要在数组中设置参数值,并再次调用设置了依赖值的GetItemParameters
protected void SetParamValues(ItemParameter[] Params)
{
foreach (ItemParameter Rp in Params)
{
if (Rp.Dependencies != null)
{
foreach (var d in Rp.Dependencies)
{
var MyParamValue = _ParamDependenciesValues.FirstOrDefault(c => c.Name == d);
if (MyParamValue == null)
{
Array.Resize(ref _ParamDependenciesValues, _ParamDependenciesValues.Count() + 1);
var MyNewParamValue = new ParameterValue {Name = d};
_ParamDependenciesValues[_ParamDependenciesValues.Length - 1] = MyNewParamValue;
MyParamValue = _ParamDependenciesValues.FirstOrDefault(c => c.Name == d);
}
if (_Dependencies.Contains(d))
{
if (MyParamValue != null && _Dependencies[d] != null)
MyParamValue.Value = _Dependencies[d].ToString();
}
}
}
}
ItemParameter[] Parameters = _Rs.GetItemParameters(_ThisReportPath, null, true, _ParamDependenciesValues, null);
}
这需要重复,直到所有参数都解析了所有依赖...