【发布时间】:2017-07-19 14:23:51
【问题描述】:
大家下午好,
在过去 2 周的大部分时间里,我一直在寻找有关我在使用 C# WinForm 应用程序时遇到的问题的帮助。
我有一个表单,它有一个显示从数据库中提取的详细信息的 DataGridView。当用户双击此网格中的一行时,代码会从 CustomerID 列中获取值,将其放入静态公共字符串中,然后打开另一个具有报表查看器的表单。
然后我要做的是让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?我真的很难过,这是我需要开始工作的最后一点,然后我的申请就完成了。
任何帮助将不胜感激。
非常感谢
更新
根据各种来源的建议,我的代码现在如下所示。
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时出现一个空白窗口。
根据 Bernard Walters 的建议,添加了底部的两个方法 - ViewButtonClicked 和 OnReportChosenFromList。添加此内容后,我收到 2 个错误说明:
- 错误 1 只有赋值、调用、递增、递减、等待和新对象表达式可以用作语句。
-
Microsoft.Reporting.WinForms.ReportParameterCollection不包含“克隆”的定义,也没有扩展方法“克隆”...
现在真的很难过。可能是错误地执行了建议。
【问题讨论】:
-
我认为报表查看器缺少数据源
-
您好,感谢您的回复。即使报表本身有数据源和数据集,报表是否需要它自己的数据源?
-
是的,根据我的经验。您在报告中指定的那个用作预期的模板。您需要提供的实际数据
-
@TomCamish 你搞定了吗?
标签: c# winforms parameters reportviewer localreport