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

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

问题描述

我创建的窗口的形式,充当报告装载机。我也创建通过报告向导中包含两个RDLC报告,并自动创建了这两份报告的数据集。现在我有两个数据集:sparcsn4DataSet.xsd和sparcsn4DataSet1.xsd正在使用存储过程并传递两个参数(dateFrom / dateTo)方法。我有约束力取决于状态数据的一个问题:

 如果(idRep.Equals(extraMove))

这是很容易绑定数据集reportview,如果你有一个报告。


但如果你有还有什么比多一个?我始终可以创建与其他的ReportViewer另一种形式,但这不是一个选项(如果你有10份报告/数据集),这是绝对没问题的?

应该有绑定数据集的ReportViewer ......有没有人有想法的一种方式,我怎么可以根据情况解决问题​​的绑定?

 如果(idRep.Equals(extraMove))
        {
            this.AGCT_ServiceEventReportTableAdapter.Fill(this.sparcsn4DataSet.AGCT_ServiceEventReport,D1,D2);
        }
        否则如果(idRep.Equals(stripStuff))
        {
            this.AGCT_StripStuffReportTableAdapter.Fill(this.sparcsn4DataSet1.AGCT_StripStuffReport,D1,D2);
        }
        其他
        {
            的MessageBox.show(哎呀,出事了......!);
        }

这是有它的ReportViewer ReportForm.cs:

 命名空间NavisReportLoader
{
    公共部分类ReportForm:表单
    {
    公众的DateTime D1;
    公众的DateTime D2;
    公共字符串DAT1;
    公共字符串DAT2;
    公共字符串idRep;
    公共ReportForm()
    {
        的InitializeComponent();
    }
    公共无效passParam(字符串dateFrom,串dateTo,串DATE1,DATE2弦)
    {
        // ispravi大毛
       D1 = Convert.ToDateTime(dateFrom);
       D2 = Convert.ToDateTime(dateTo)方法;
       DAT1 = DATE1;
       DAT2 = DATE2;
    }
    公共无效报告(字符串ID)
    {
        idRep = ID;
    }
    私人无效ReportForm_Load(对象发件人,EventArgs的发送)
    {        ReportParameter [] =参数新ReportParameter [2];
        参数[0] =新ReportParameter(日期1,DAT1);
        参数[1] =新ReportParameter(日期2,DAT2);
        this.reportViewer1.LocalReport.SetParameters(参数);        如果(idRep.Equals(extraMove))
        {
            this.AGCT_ServiceEventReportTableAdapter.Fill(this.sparcsn4DataSet.AGCT_ServiceEventReport,D1,D2);
        }
        否则如果(idRep.Equals(stripStuff))
        {
            this.AGCT_StripStuffReportTableAdapter.Fill(this.sparcsn4DataSet1.AGCT_StripStuffReport,D1,D2);
        }
        其他
        {
            的MessageBox.show(哎呀,出事了......!);
        }        this.reportViewer1.RefreshReport();
    }
    }
   }


解决方案

OK,试图弄明白,昨天我发现了一个解决方案,是可以接受我,所以我想与他人分享:

1.st你需要创建属性的类模型,因此它会在数据集中补充说:
例如:

 命名空间NavisReportLoader.App_Data
{
    公共类ExtraMoveModel
    {
        公共字符串事件类型{搞定;组; }
        公众诠释EVENTCOUNT {搞定;组; }
        公众诠释Num20 {搞定;组; }
        公众诠释Num40 {搞定;组; }
        公众诠释Num45 {搞定;组; }
        公众诠释TEU {搞定;组; }
        公众持股量货物{搞定;组; }
        公众持股量去皮{搞定;组; }
        公众持股量总计{搞定;组; }
    }
}

之后,你需要连接到数据库中创建朴素简单类,并调用存储过程,传递参数,并使用数据读取器读取输出。在我的例子,我加入到这一列表,并列举我的模型:

例如:

 公共类ExtraMoveDataSet
{
    字符串的connectionString = @数据源= SAMPLEDB;初始目录=测试;用户ID = SA;密码=测试;
    公共IEnumerable的< ExtraMoveModel> extraMove(日期时间dateFrom,日期dateTo)方法
    {
        VAR tempList =新的List< ExtraMoveModel>();
        //字符串的connectionString = @数据源= nsqltest;初始目录= sparcsn4;用户ID = SA;密码= lo02Nova;
        康涅狄格州的SqlConnection =新的SqlConnection(的connectionString);
        CMD的SqlCommand =新的SqlCommand(AGCT_ServiceEventReport,康恩);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue(@ dateFrom,dateFrom);
        cmd.Parameters.AddWithValue(@ dateTo,dateTo)方法;
        conn.Open();        使用(VAR博士= cmd.ExecuteReader())
        {
            而(dr.Read())
            {
                变种临时=新ExtraMoveModel();
                temp.EventType =博士[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 [货物]的ToString(),新的CultureInfo(HR-HR));
                temp.Tare = float.Parse(DR [皮重]的ToString(),新的CultureInfo(HR-HR));
                temp.Total = float.Parse(DR [总]的ToString(),新的CultureInfo(HR-HR));
                tempList.Add(临时);
            }
        }
        conn.Close();
        返回tempList;
    }


  1. 第一步是创建数据集,将有相同的名字从模特属性。


  1. 步创建您将绑定数据集报表。


  1. 终于可以把它添加到reportViewer1

     私人无效ReportForm_Load(对象发件人,EventArgs的发送)
        {
            ExtraMoveDataSet EMDS =新ExtraMoveDataSet();
            如果(idRep.Equals(extraMove))
            {        ReportParameter [] =参数新ReportParameter [2];
            参数[0] =新ReportParameter(日期1,DAT1);
            参数[1] =新ReportParameter(日期2,DAT2);
            //字符串路径= Directory.GetCurrentDirectory();
            //字符串替换= path.Replace(\\\\ \\\\斌调试,)+\\\\ \\\\的App_Data+ReportExtraMove.rdlc
            变种RET = emDS.extraMove(D1,D2);
            ReportDataSource RDS =新ReportDataSource(extraMove,ret.ToArray());
            this.reportViewer1.LocalReport.DataSources.Add(RDS);
            //this.reportViewer1.LocalReport.ReportPath =取代;
            this.reportViewer1.LocalReport.ReportEmbeddedResource =NavisReportLoader.App_Data.ReportExtraMove.rdlc;
            this.reportViewer1.LocalReport.SetParameters(参数);
            this.reportViewer1.RefreshReport();
        }


我希望这将有助于其他加快速度。

干杯!

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.

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...!");
        }

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 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:

example:

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. step is to create dataset that will have same name as properties from a model.

  1. step create report on which you will bind dataset.

  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.

cheers!

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

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