大家下午好,
在过去 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
不包含“克隆”的定义,也没有扩展方法“克隆”...
现在真的难住了。可能错误地执行了建议。