带参数的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只能将赋值,调用,递增,递减,等待和新对象表达式用作语句。
- 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本地报表的主要内容,如果未能解决你的问题,请参考以下文章