【问题标题】:Passing ReportParameters back to method将 ReportParameters 传递回方法
【发布时间】:2015-06-05 16:48:25
【问题描述】:

我有一个应用程序使用本地存储的 RDL 进行所有报告。我有两种形式,一种是包含 TabPageControl 的简单查看器,另一种是用户可以用来选择报表参数的 FLP 控件。我们计划提供 30 多个选项,但目前我们只有大约 5 个(某些报告显示某些选项,其余选项隐藏)。

我遇到的问题是我需要有某种方法来获取他们从列表或集合中选择的选项。我现在使用的方法是

public void AddReportToViewer(string reportName, List<ReportParameter> parameterList = null)
    {
        TabPage newPage = new TabPage();      
        ReportViewer reportViewer = new ReportViewer();

        newPage.Text = reportName;
        newPage.Controls.Add(reportViewer);

        tbcReports.TabPages.Add(newPage); //adding the report viewer to page, should do this at the end of the method

        reportViewer.Reset();
        reportViewer.ProcessingMode = ProcessingMode.Local;
        reportViewer.LocalReport.ReportPath = "MyPath/reportName";
        ReportDataSource rds = new ReportDataSource();

        //parse parameters to individual objects to use with method calls

        int parameterEmployeeID = 0;
        int parameterStoreID = 0;
        List<int> parameterStoreIDs = null;
        DateTime parameterFromDate = DateTime.Now;
        DateTime parameterToDate = DateTime.Now;

        //Use parameters to get objects, just one here, but we have multiple

        List<EmployeeTimeclockReportObjects> timeclock = reportBL.getEmployeeTimeclock(parameterEmployeeID, parameterStoreID, parameterFromDate, parameterToDate);
        reportBindingSource.DataSource = timeclock;
        rds = new ReportDataSource("TimeclockEntries", reportBindingSource);
        reportViewer.LocalReport.DataSources.Add(rds);

        reportViewer.RefreshReport();
        reportViewer.Dock = DockStyle.Fill;            
    }

这一切都有效,但这里是我需要帮助的地方

        int parameterEmployeeID = 0;
        int parameterStoreID = 0;
        List<int> parameterStoreIDs = null;
        DateTime parameterFromDate = DateTime.Now;
        DateTime parameterToDate = DateTime.Now;

我需要从报告参数列表中删除值,以便在数据填充方法中使用它们。例如,我正在做类似...

int parameterEmployeeID = Convert.ToInt32(parameterList[parameterList.FindIndex(x => x.Name == "employeeID")].Values[0]);

但后来我在List&lt;int&gt; parameterStoreIDs 上遇到了问题,因为我无法将 StringCollection 转换为整数列表。

是否有人对 a) 将 StringCollection 转换为整数列表或 b) 除了List&lt;ReportParameters&gt; 之外我可以尝试做的任何其他事情从第二种形式中获取信息有任何建议吗????

【问题讨论】:

  • 我对 (b) 有点困惑。如果您不通过报表将值传递到数据源,为什么还需要将参数传递给报表?如果你不这样做,为什么要使用 ReportParameter 对象?
  • 是的,老实说,我不需要使用ReportParameter 对象,它们只是传回可能是列表、整数、字符串或以上所有对象列表的最简单方法,同时。我试图找到一种方法来从一个表单中获取随机对象的集合,并使用它们来填充数据源。 ReportParameters 是我发现的第一个可以用来返回多种对象类型的东西——绝对没有附加到它们
  • 您的参数有多动态?你认为 30 人左右会是一段时间内的全​​部要求吗?因为我认为编写一个具有所有不同参数值(或集合)的属性的参数类可能是你最好的选择。 ReportParameter 和类似的可以是任何对象/集合的事情是,您必须整合关于它们是什么以及如何在某处使用它们的智能。如果您创建了一个自定义类,那么您已经完成了一次。
  • 我们仍在决定...我们很确定 30 是我们将使用的全部,但同时我想在未来扩展中构建-尽可能的能力。我会考虑这样做 --- 感谢所有帮助!

标签: c# type-conversion rdl


【解决方案1】:

对于问题 (a),考虑如下内容:

我不清楚代码中的哪个变量是StringCollection,所以为了示例,我只是将其称为strings

List<int> ints = strings.Cast<string>(s => Convert.ToInt32(s)).ToList();

【讨论】:

  • 是的,我尝试过类似的方法,但 System.Collections.Specialized.StringCollection 对象不包含任何 ConvertCast 类型调用。我通过一个 foreach 循环来迭代、转换和返回一个列表,但它看起来像我第一次开始编程时编写的代码。我的意思是......如果它有效,它就有效,但同时它是如此丑陋,让我想哭!
  • 您的using 语句中有System.Linq 吗? StringCollection 确实实现了IEnumerable,这意味着您可以使用扩展方法Cast&lt;string&gt; 来获得IEnumerable&lt;string&gt;。一旦你有了它,你可以使用 lambda 转换为Int32,就像我在回答中所做的那样。 (参见扩展方法部分:msdn.microsoft.com/en-us/library/…
  • 但是如果你觉得这个丑陋的例程卡住了,你可以将它包装在一个扩展方法中并像这样调用它:strings.ConvertToIntegerList()
  • 使用你的System.Linq 提示实际上让我把它变成了正确的格式!万分感谢!这是我必须做的 -> List&lt;int&gt; parameterStoreIDs = parameterList[parameterList.FindIndex(x =&gt; x.Name == "storeIDs")].Values.Cast&lt;int&gt;().ToList(); --- 有点难以阅读,但至少它是可用的!
  • 太棒了!您甚至可以将其提取到一个单独的子例程中,您只需将参数列表和值名称传递给该子例程!
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多