Локальный отчет C# ReportViewer с параметромC#

Место общения программистов C#
Ответить
Anonymous
 Локальный отчет C# ReportViewer с параметром

Сообщение Anonymous »

Всем добрый день!
Большую часть последних двух недель я провел в поисках помощи по проблеме, возникшей у меня с моим приложением 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
{}

}
}
}
Я неправильно использую 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. После добавления этого я больше не получал ошибку определения отчета, а просто пустое окно при загрузке средства просмотра отчетов.
Два нижних метода — ViewButtonClicked и OnReportChosenFromList были добавлены по предложению Бернарда Уолтерса. После добавления этого я получаю две ошибки:
  • Ошибка 1. В качестве оператора можно использовать только выражения присваивания, вызова, увеличения, уменьшения, ожидания и нового объекта.
  • Код: Выделить всё

    Microsoft.Reporting.WinForms.ReportParameterCollection
    не содержит определения «Клонировать» и метода расширения «Клонировать»...
Теперь действительно в тупике. Вероятно, неправильно реализовали предложения.

Подробнее здесь: https://stackoverflow.com/questions/425 ... -parameter
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»