Comment lier dynamicment datasource à reportviewer sous windows forms c #

J’ai créé un formulaire Windows faisant office de chargeur de rapports. J’ai également créé deux rapports RDLC par assistant de création de rapports et il a automatiquement créé un dataset pour ces deux rapports. Maintenant, j’ai deux ensembles de données: sparcsn4DataSet.xsd et sparcsn4DataSet1.xsd qui utilisent une procédure stockée et transmet deux parameters (dateFrom / dateTo). J’ai un problème avec la liaison des données en fonction du statut:

if (idRep.Equals("extraMove")) 

Il est assez facile de lier un dataset à reportview, si vous avez un seul rapport.

Contraignant mais si vous en avez plus d’un? Je peux toujours créer un autre formulaire avec un autre reportviewer, mais ce n’est pas une option (que se passe-t-il si vous avez 10 rapports / jeux de données), c’est définitivement hors de question?

Il devrait y avoir un moyen de lier l’dataset à reportviewer … Quelqu’un a-t-il une idée de comment résoudre un problème de liaison en fonction de son statut?

 if (idRep.Equals("extraMove")) { this.AGCT_ServiceEventReportTableAdapter.Fill(this.sparcsn4DataSet.AGCT_ServiceEventReport, d1,d2); } else if (idRep.Equals("ssortingpStuff")) { this.AGCT_SsortingpStuffReportTableAdapter.Fill(this.sparcsn4DataSet1.AGCT_SsortingpStuffReport, d1, d2); } else { MessageBox.Show("Ooops, something went wrong...!"); } 

C’est ReportForm.cs qui a reportviewer dessus:

 namespace NavisReportLoader { public partial class ReportForm : Form { public DateTime d1; public DateTime d2; public ssortingng dat1; public ssortingng dat2; public ssortingng idRep; public ReportForm() { InitializeComponent(); } public void passParam(ssortingng dateFrom, ssortingng dateTo, ssortingng date1, ssortingng date2) { //ispravi ovo d1 = Convert.ToDateTime(dateFrom); d2 = Convert.ToDateTime(dateTo); dat1 = date1; dat2 = date2; } public void report(ssortingng id) { idRep = id; } private void ReportForm_Load(object sender, EventArgs e) { ReportParameter[] param = new ReportParameter[2]; param[0] = new ReportParameter("date1", dat1); param[1] = new ReportParameter("date2", dat2); this.reportViewer1.LocalReport.SetParameters(param); if (idRep.Equals("extraMove")) { this.AGCT_ServiceEventReportTableAdapter.Fill(this.sparcsn4DataSet.AGCT_ServiceEventReport, d1,d2); } else if (idRep.Equals("ssortingpStuff")) { this.AGCT_SsortingpStuffReportTableAdapter.Fill(this.sparcsn4DataSet1.AGCT_SsortingpStuffReport, d1, d2); } else { MessageBox.Show("Ooops, something went wrong...!"); } this.reportViewer1.RefreshReport(); } } } 

OK, en essayant de comprendre, hier, j’ai trouvé une solution qui me convenait, alors je voulais partager avec d’autres:

1.st vous devez créer un modèle de classe avec des propriétés afin qu’il soit ajouté à l’dataset: exemple:

 namespace NavisReportLoader.App_Data { public class ExtraMoveModel { public ssortingng EventType { get; set; } public int EventCount { get; set; } public int Num20 { get; set; } public int Num40 { get; set; } public int Num45 { get; set; } public int TEU { get; set; } public float Cargo { get; set; } public float Tare { get; set; } public float Total { get; set; } } } 

Après cela, vous devez créer une classe simple pour la connexion à la firebase database et appeler la procédure stockée, transmettre les parameters et les lire à l’aide de la sortie du lecteur de données. Dans mon exemple, j’ai ajouté ceci à une liste et énumère mon modèle:

Exemple:

 public class ExtraMoveDataSet { ssortingng connectionSsortingng = @"Data Source=sampleDB; Initial Catalog=test; User Id=sa; Password=test"; public IEnumerable extraMove(DateTime dateFrom, DateTime dateTo) { var tempList = new List(); //ssortingng connectionSsortingng = @"Data Source=nsqltest; Initial Catalog=sparcsn4; User Id=sa; Password=lo02Nova"; SqlConnection conn = new SqlConnection(connectionSsortingng); SqlCommand cmd = new SqlCommand("AGCT_ServiceEventReport", conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@dateFrom", dateFrom); cmd.Parameters.AddWithValue("@dateTo", dateTo); conn.Open(); using (var dr = cmd.ExecuteReader()) { while (dr.Read()) { var temp = new ExtraMoveModel(); temp.EventType = dr["event_type"].ToSsortingng(); temp.EventCount = Convert.ToInt32(dr["CNT"]); temp.Num20 = Convert.ToInt32(dr["NUM20"]); temp.Num40 = Convert.ToInt32(dr["NUM40"]); temp.Num45 = Convert.ToInt32(dr["NUM45"]); temp.TEU = Convert.ToInt32(dr["TEU"]); temp.Cargo = float.Parse(dr["Cargo"].ToSsortingng(),new CultureInfo("hr-HR")); temp.Tare = float.Parse(dr["Tare"].ToSsortingng(),new CultureInfo("hr-HR")); temp.Total = float.Parse(dr["Total"].ToSsortingng(),new CultureInfo("hr-HR")); tempList.Add(temp); } } conn.Close(); return tempList; } 
  1. L’étape consiste à créer un jeu de données qui aura le même nom que les propriétés d’un modèle.

entrez la description de l'image ici

  1. étape créer un rapport sur lequel vous allez lier le jeu de données.

entrez la description de l'image ici

  1. enfin, vous pouvez l’append à reportViewer1

     private void ReportForm_Load(object sender, EventArgs e) { ExtraMoveDataSet emDS = new ExtraMoveDataSet(); if (idRep.Equals("extraMove")) { ReportParameter[] param = new ReportParameter[2]; param[0] = new ReportParameter("date1", dat1); param[1] = new ReportParameter("date2", dat2); //ssortingng path = Directory.GetCurrentDirectory(); //ssortingng replace = path.Replace("\\bin\\Debug", "") + "\\App_Data\\"+"ReportExtraMove.rdlc"; var ret = emDS.extraMove(d1, d2); ReportDataSource rds = new ReportDataSource("extraMove", ret.ToArray()); this.reportViewer1.LocalReport.DataSources.Add(rds); //this.reportViewer1.LocalReport.ReportPath = replace; this.reportViewer1.LocalReport.ReportEmbeddedResource = "NavisReportLoader.App_Data.ReportExtraMove.rdlc"; this.reportViewer1.LocalReport.SetParameters(param); this.reportViewer1.RefreshReport(); } } 

J’espère que cela aidera les autres à accélérer les choses.

à votre santé!

Pour obliger Visual Studio à créer automatiquement la source de liaison, vous devez d’abord créer le rapport (.rdlc). Avec une source de données liée, lorsque vous ajoutez le composant (reportviewer) et que vous associez le nom du rapport au rapport indiqué dans votre image, une fois le rapport sélectionné, il crée automatiquement une source de liaison avec le nom utilisé créé le design.

J’ai passé du temps sur le même problème. J’utilise VS 2013 où le jeu de données est connecté via un BindingSource créé automatiquement dans le formulaire de rapport. Si vous créez le rapport et ajoutez tous les éléments requirejs, tout fonctionne correctement. Si vous (par exemple) ajoutez une table plus tard, les ressources de liaison se perdent ou ne sont pas créées.

Modifiez le formulaire de rapport en mode Création, cliquez sur l’object ReportViewer et utilisez la petite pointe de flèche “Tâches” dans le coin supérieur droit. Sélectionnez “Rebind Data Sources” ou “Choose Data Sources” pour vérifier qu’elles sont correctement reliées.