根据参数依赖关系过滤报告参数有效值

时间:2015-03-17 14:26:56

标签: c# asp.net reporting-services reportviewer

我正在开发一个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控件中选择参数时,此功能可以是观察者。

我的问题是,如何在我的代码中实现此功能?

1 个答案:

答案 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);
    }

这需要重复,直到所有参数都解析了所有依赖...