【问题标题】:Filter report parameter valid values based on parameter dependencies根据参数依赖过滤报表参数有效值
【发布时间】:2015-05-20 00:50:37
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    每次选择另一个参数所依赖的值时,您都需要填充参数依赖值。我发现的最佳解决方案是根据本文使用哈希表: 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);
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多