如何在windows窗体c#上动态绑定数据源到reportviewer [英] How to bind dynamically datasource to reportviewer on windows forms c#

查看:28
本文介绍了如何在windows窗体c#上动态绑定数据源到reportviewer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了充当报告加载器的 Windows 窗体.我还通过报告向导创建了两个 RDLC 报告,它自动为这两个报告创建了数据集.现在我有两个数据集:sparcsn4DataSet.xsd 和 sparcsn4DataSet1.xsd,它们使用存储过程并传递两个参数(dateFrom/dateTo).我在绑定数据集时遇到问题,具体取决于状态:

I have created windows form that acts as report loader. I have created also two RDLC reports by report wizard and it automatically created dataset for those two reports. Now I have two datasets: sparcsn4DataSet.xsd and sparcsn4DataSet1.xsd that are using stored procedure and passes two parameters (dateFrom/ dateTo). I have a problem with binding dataset depending on the status:

if (idRep.Equals("extraMove"))

如果您有一份报告,将数据集绑定到报告视图非常容易.

It is quite easy to bind dataset to reportview, if you have one report.

但是如果你有多个呢?我总是可以用另一个报表查看器创建另一个表单,但这不是一个选项(如果你有 10 个报表/数据集怎么办),这绝对是不可能的?

but what if you have more than one? I can always create another form with another reportviewer but this is not an option (what if you have 10 reports/datasets), this is definitely out of question?

应该有一种方法可以将数据集绑定到报表查看器...有没有人知道,我如何根据状态解决绑定问题?

There should be a way to bind dataset to reportviewer... Does anyone have idea, how I can solve binding problem depending on the status?

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

这是带有报表查看器的 ReportForm.cs:

This is ReportForm.cs that have reportviewer on it:

namespace NavisReportLoader
{
    public partial class ReportForm : Form
    {
    public DateTime d1;
    public DateTime d2;
    public string dat1;
    public string dat2;
    public string idRep;
    public ReportForm()
    {
        InitializeComponent();
    }
    public void passParam(string dateFrom, string dateTo, string date1, string date2)
    {
        //ispravi ovo
       d1 = Convert.ToDateTime(dateFrom);
       d2 = Convert.ToDateTime(dateTo);
       dat1 = date1;
       dat2 = date2;
    }
    public void report(string 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("stripStuff"))
        {
            this.AGCT_StripStuffReportTableAdapter.Fill(this.sparcsn4DataSet1.AGCT_StripStuffReport, d1, d2);
        }
        else
        {
            MessageBox.Show("Ooops, something went wrong...!");
        }

        this.reportViewer1.RefreshReport();
    }
    }
   }

推荐答案

好吧,想办法解决,昨天找到了一个我能接受的解决方案,所以想分享给大家:

OK, trying to figure it out, yesterday I found a solution which was acceptable to me, so I wanted to share with others:

1.st 您需要创建一个具有属性的类模型,以便将其添加到数据集中:例子:

1.st you need to create a class model with properties so it will be added in dataset: example:

namespace NavisReportLoader.App_Data
{
    public class ExtraMoveModel
    {
        public string 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; }
    }
}

之后,您需要创建简单的类来连接数据库并调用存储过程,传递参数并使用数据读取器输出读取.在我的示例中,我已将其添加到列表中并枚举我的模型:

after that you need to create plain simple class for connecting to the database and call the stored procedure, pass the parameters and read using data reader output. In my example, I have added this into a list and enumerate my model:

示例:

public class ExtraMoveDataSet
{
    string connectionString = @"Data Source=sampleDB; Initial Catalog=test; User Id=sa; Password=test";
    public IEnumerable<ExtraMoveModel> extraMove(DateTime dateFrom, DateTime dateTo)
    {
        var tempList = new List<ExtraMoveModel>();
        //string connectionString = @"Data Source=nsqltest; Initial Catalog=sparcsn4; User Id=sa; Password=lo02Nova";
        SqlConnection conn = new SqlConnection(connectionString);
        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"].ToString();
                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"].ToString(),new CultureInfo("hr-HR"));
                temp.Tare = float.Parse(dr["Tare"].ToString(),new CultureInfo("hr-HR"));
                temp.Total = float.Parse(dr["Total"].ToString(),new CultureInfo("hr-HR"));
                tempList.Add(temp);
            }
        }
        conn.Close();
        return tempList;
    }

  1. 步骤是创建与模型属性同名的数据集.

  1. 步骤创建您将绑定数据集的报告.

  1. 最后你可以把它添加到reportViewer1

  1. finally you can add it to the 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);
        //string path = Directory.GetCurrentDirectory();
        //string 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();
    }
}

我希望这能帮助其他人加快速度.

I hope this will help other to speed things up.

干杯!

这篇关于如何在windows窗体c#上动态绑定数据源到reportviewer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆