大家下午好,
过去 2 周的大部分时间我都在寻求有关 C# WinForm 应用程序问题的帮助。
我有一个表单,其中有一个 DataGridView 显示从数据库中提取的详细信息。当用户双击该网格中的一行时,代码从 CustomerID 列中获取值,将其放入静态公共字符串中,然后打开另一个具有报表查看器的表单。
然后我想做的是让报表查看器使用 CustomerID 作为参数来运行报表。
到目前为止,我所做的就是让它声明报告定义尚未指定。
我的 SQL 服务器是一台没有 SSRS 的旧服务器,由于更改请求问题,我无法安装它,所以我必须使用本地报告,而不是服务器报告。
我创建报告的方法是转到 Visual Studio 中的解决方案资源管理器,然后转到“添加”-“新项目”-“报告”,然后提供数据集和参数。我将该报告放在一个名为“Reports”的子文件夹中,该子文件夹位于解决方案中所有表单的旁边。
我的报告查看器表单的代码如下。别笑太多,我是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
loaded.
下面的两个方法 - ViewButtonClicked 和 OnReportChosenFromList 是根据 Bernard Walters 的建议添加的。添加此后,我收到 2 个错误,指出:
- 错误 1 只有赋值、调用、递增、递减、await 和 new 对象表达式可以用作语句。
-
Microsoft.Reporting.WinForms.ReportParameterCollection
不包含“克隆”的定义,并且没有扩展方法“克隆”...
现在真是难住了。可能错误地实施了建议。