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
{}
}
}
}
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;
}
}
}
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.
- enthält keine Definition für „Klonen“ und keine Erweiterungsmethode „Klonen“...
Code: Select all
Microsoft.Reporting.WinForms.ReportParameterCollection
Mobile version