带参数的C#ReportViewer本地报表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带参数的C#ReportViewer本地报表相关的知识,希望对你有一定的参考价值。

下午好,

在过去的两周里,我花了大部分时间寻找有关我使用C#WinForm应用程序的问题的帮助。

我有一个表单,其中有一个DataGridView显示从数据库中提取的详细信息。当用户双击此网格中的行时,代码将从CustomerID列中获取值,将其放入静态公共字符串,然后打开另一个具有reportviewer的表单。

我正在尝试做的是让reportviewer使用CustomerID作为参数来运行报告。

到目前为止,我所要做的就是让它说明尚未指定报告定义。

我的SQL服务器是一个没有SSRS的旧服务器,由于更改请求问题我无法安装它,因此我不得不使用本地报告,而不是服务器报告。

我创建报告的方式是在Visual Studio中转到我的解决方案资源管理器,然后转到添加 - 新项目 - 报告,然后我给出了一个数据集和一个参数。我把报告放在一个名为Reports的子文件夹中,它位于我所有表单旁边的解决方案中。

我的reportviewer表单的代码如下。不要笑太多,我100%自学。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
using System.Data.SqlClient;

namespace FormsApp
{
public partial class ReportGenerator : Form
{
    public ReportGenerator()
    {
        InitializeComponent();
        this.reportViewer1.RefreshReport();
    }

    private void ReportGenerator_Load(object sender, EventArgs e)
    {
        if (CustomerList.CustomerID!= "")
        {
            this.reportViewer1.ProcessingMode = ProcessingMode.Local;
            this.reportViewer1.LocalReport.ReportPath = "\Reports\CustomerDetails.rdlc";
            this.reportViewer1.ShowParameterPrompts = true;
            ReportParameter CustID = new ReportParameter("CustomerID",CustomerList.CustomerID);
            this.reportViewer1.LocalReport.SetParameters(CustID);
        }
        else
        {}

    }
    }
}

我是否正确使用LocalReport?我真的很难过,这是我需要工作的最后一点,然后我的应用程序就完成了。

任何帮助将不胜感激。

非常感谢

UPDATE

我的代码现在显示如下来自各种来源的建议。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
using System.Data.SqlClient;

namespace FormsApp
{
    public partial class ReportGenerator : Form
{
    public ReportGenerator()
    {
        InitializeComponent();
        this.reportViewer1.RefreshReport();
    }


    private DataTable getCustomerData()
    {
        SqlConnection con = new SqlConnection(Home.ConString);
        DataSet ds = new DataSet();
        ds.DataSetName = "CustomerListRetrieve";
        string sql = "SELECT * FROM Customers";
        SqlDataAdapter da = new SqlDataAdapter(sql, con);
        da.Fill(ds);
        DataTable dt = ds.Tables[0];
        return dt;
    }


    private void ReportGenerator_Load(object sender, EventArgs e)
    {
        if (CustomerList.CustomerID != "")
        {
            this.reportViewer1.Reset();
            this.reportViewer1.LocalReport.ReportEmbeddedResource = "FormsApp.Reports.CustomerDetails.rdlc";
            ReportDataSource rds = new ReportDataSource("CustomerListRetrieve", getCustomerData());
            this.reportViewer1.LocalReport.DataSources.Clear();
            this.reportViewer1.LocalReport.DataSources.Add(rds);
            ReportParameter CustID= new ReportParameter("CustomerID", CustomerList.CustomerID);
            this.reportViewer1.LocalReport.SetParameters(CustID);
            this.reportViewer1.LocalReport.Refresh();
            ViewButtonClicked();
        }
        else
        {

        }

    }

    private void ViewButtonClicked(object sender, ReportParametersEventArgs e)
    {
        var SubmittedParameters = e.Parameters.Clone();
        e.Parameters.Clear();
        SubmittedParameters.Where(x => x.Name == "Parametername").FirstOrDefault().Values[0] = "YourValue";
        SubmittedParameters.ToList().ForEach(x => e.Parameters.Add(x));
    }
    private void OnReportChosenFromList()
    {
        reportViewer1.SubmittingParameterValues -= ViewButtonClicked;
        reportViewer1.SubmittingParameterValues += ViewButtonClicked;
    }
}

}

我在codingbiz的响应后添加了数据源代码。添加后,我不再获得报告定义错误,只是在加载reportviewer时出现空白窗口。

最后两个方法 - ViewButtonClicked和OnReportChosenFromList是根据Bernard Walters的建议添加的。添加后我得到2个错误说明:

  1. 错误1只能将赋值,调用,递增,递减,等待和新对象表达式用作语句。
  2. Microsoft.Reporting.WinForms.ReportParameterCollection不包含'Clone'的定义,也没有扩展方法'Clone'...

真的难倒了。可能实施错误的建议。

答案

在您拥有reportViewer1.RefreshReport()之前,reportViewer将不会执行操作;这是它在本地或远程运行报告的命令。每次您要报告刷新或最初加载时,您都需要此命令。

另一答案

我遇到了同样的问题,这是修复:

private void ViewButtonClicked(object sender, ReportParametersEventArgs e)
{
    var SubmittedParameters = e.Parameters.Clone();
    e.Parameters.Clear();
    SubmittedParameters.Where(x => x.Name == "Parametername").FirstOrDefault().Values[0] = "YourValue";
    SubmittedParameters.ToList().ForEach(x => e.Parameters.Add(x));
}

private void OnReportChosenFromList()
{
    reportViewer.SubmittingParameterValues -= ViewButtonClicked;
    reportViewer.SubmittingParameterValues += ViewButtonClicked;
}

这一行:

reportViewer.SubmittingParameterValues += ViewButtonClicked;

在触发事件时在reportviewer上设置一个执行ViewButtonClicked的侦听器。

然后ViewButtonClicked拦截包含发送到SSRS的所有参数数据的消息,这允许您复制其数据,编辑它,然后在将消息发送到SSRS之前再次添加数据。

注意:这已被编辑了一些,但大部分都直接从我的代码中复制

以上是关于带参数的C#ReportViewer本地报表的主要内容,如果未能解决你的问题,请参考以下文章

ReportViewer 报表使用整理

C# ReportViewer 未指定报表定义的来源

ReportViewer遇到的坑

C# 向RDLC报表传入参数出错 急求解答!!

winform 使用 ReportViewer做报表

ReportViewer“缺少 URL 参数:名称”