Большую часть последних двух недель я провел в поисках помощи по проблеме, возникшей у меня с моим приложением C# WinForm.
У меня есть форма, в которой есть DataGridView, отображающий детали, полученные из базы данных. Когда пользователь дважды щелкает строку в этой сетке, код извлекает значение из столбца CustomerID, помещает его в статическую общедоступную строку, а затем открывает другую форму, имеющую средство просмотра отчетов.
То, что я пытаюсь сделать, — это заставить средство просмотра отчетов запустить отчет, используя CustomerID в качестве параметра.
Пока все, что мне удалось сделать, это заставить его указать, что определение отчета не указано.
Мой SQL-сервер — это старый сервер, на котором нет SSRS, и я не могу его установить из-за проблем с запросом на изменение, поэтому мне приходится использовать локальный отчет, а не отчет сервера.
Способ создания отчета заключался в том, чтобы перейти в обозреватель решений в Visual Studio и перейти в раздел «Добавить» — «Новый элемент» — «Отчет», где я затем предоставил набор данных и параметр. Я поместил отчет в подпапку под названием «Отчеты», которая находится в решении рядом со всеми моими формами.
Код моей формы просмотра отчетов приведен ниже. Не смейтесь слишком много, я на 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
{}
}
}
}
Буду очень признателен за любую помощь.
Большое спасибо
ОБНОВЛЕНИЕ
Мой код теперь выглядит так, как показано ниже, следуя рекомендациям из различных источников.
Код: Выделить всё
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;
}
}
}
Два нижних метода — ViewButtonClicked и OnReportChosenFromList были добавлены по предложению Бернарда Уолтерса. После добавления этого я получаю две ошибки:
- Ошибка 1. В качестве оператора можно использовать только выражения присваивания, вызова, увеличения, уменьшения, ожидания и нового объекта.
- не содержит определения «Клонировать» и метода расширения «Клонировать»...
Код: Выделить всё
Microsoft.Reporting.WinForms.ReportParameterCollection
Подробнее здесь: https://stackoverflow.com/questions/425 ... -parameter
Мобильная версия