C# ReportViewer Lokaler Bericht mit ParameterC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 C# ReportViewer Lokaler Bericht mit Parameter

Post by Anonymous »

Guten Tag zusammen,
Ich habe den größten Teil der letzten zwei Wochen damit verbracht, nach Hilfe für das Problem zu suchen, das ich mit meiner C#-WinForm-Anwendung habe.
Ich habe ein Formular mit einer DataGridView, die Details aus einer Datenbank anzeigt. Wenn der Benutzer auf eine Zeile in diesem Raster doppelklickt, ruft der Code den Wert aus der Spalte „CustomerID“ ab, fügt ihn in eine statische öffentliche Zeichenfolge ein und öffnet dann ein anderes Formular mit einem Reportviewer.
Was ich dann versuche, ist, den Reportviewer dazu zu bringen, einen Bericht auszuführen, wobei ich die CustomerID als Parameter verwende.
Bisher habe ich es nur geschafft, ihm mitzuteilen, dass die Berichtsdefinition nicht angegeben wurde.
Mein SQL-Server ist ein alter Server ohne SSRS, und ich kann ihn aufgrund von Problemen mit Änderungsanforderungen nicht installieren. Daher muss ich einen lokalen Bericht und keinen Serverbericht verwenden.
Ich habe den Bericht erstellt, indem ich zu meinem Projektmappen-Explorer in Visual Studio gegangen bin und zu „Hinzufügen – Neues Element – Bericht“ gegangen bin, dem ich dann einen Datensatz und einen Parameter gegeben habe. Ich habe den Bericht in einem Unterordner namens „Reports“ abgelegt, der sich in der Lösung neben allen meinen Formularen befindet.
Der Code für mein Reportviewer-Formular ist wie folgt. Lache nicht zu viel, ich bin 100 % Autodidakt.

Code: Select all

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
{}

}
}
}
Verwende ich LocalReport falsch? Ich bin wirklich ratlos und das ist das Letzte, was ich brauche, um mit der Arbeit zu beginnen, dann ist meine Bewerbung fertig.
Jede Hilfe wäre sehr dankbar.
Vielen Dank
UPDATE
Mein Code sieht jetzt wie folgt aus und folgt Vorschlägen aus verschiedenen Quellen.

Code: Select all

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;
}
}
}
Der Datenquellencode, den ich nach der Antwort von Codingbiz hinzugefügt habe. Nachdem ich dies hinzugefügt habe, erhalte ich nicht mehr den Berichtsdefinitionsfehler, sondern nur ein leeres Fenster, wenn der Reportviewer geladen wird.
Die beiden unteren Methoden – ViewButtonClicked und OnReportChosenFromList – wurden auf Vorschlag von Bernard Walters hinzugefügt. Nachdem ich dies hinzugefügt habe, erhalte ich zwei Fehlermeldungen mit der Meldung:
  • Fehler 1 Nur Zuweisungs-, Aufruf-, Inkrementierungs-, Dekrementierungs-, Warten- und neue Objektausdrücke können als Anweisung verwendet werden.
  • Code: Select all

    Microsoft.Reporting.WinForms.ReportParameterCollection
    enthält keine Definition für „Klonen“ und keine Erweiterungsmethode „Klonen“...
Jetzt bin ich wirklich ratlos. Wahrscheinlich wurden die Vorschläge falsch umgesetzt.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post