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

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

问题描述

我已经创建了窗体作为报表加载器。我还通过报告向导创建了两个RDLC报告,并自动为这两个报告创建了数据集。现在我有两个数据集:sparcsn4DataSet.xsd和sparcsn4DataSet1.xsd,它们使用存储过程并传递两个参数(dateFrom / dateTo)。根据状态,我有绑定数据集的问题:

  if(idRep.Equals(extraMove))

如果您有一个报告,则很容易将数据集绑定到报表视图。




但如果你有不止一个?我可以随时使用另一个报表查看器创建另一个表单,但这不是一个选项(如果您有10个报告/数据集),这绝对没有问题?



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

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

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

 命名空间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 wrong wrong!!);
}

this.reportViewer1.RefreshReport();
}
}
}


解决方案

好的,试着弄清楚,昨天我找到了一个可以接受的解决方案,所以我想和别人分享一下:



需要创建具有属性的类模型,以便将其添加到数据集中:
示例:

 命名空间NavisReportLoader.App_Data 
{
public class ExtraMoveModel
{
public string EventType {get;组; }
public int EventCount {get;组; }
public int Num20 {get;组; }
public int Num40 {get;组; }
public int Num45 {get;组; }
public int TEU {get;组; }
public float Cargo {get;组; }
public float Tare {get;组; }
public float Total {get;组; }
}
}

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



示例:

  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();

使用(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(),新的CultureInfo(hr-HR));
temp.Tare = float.Parse(dr [Tare]。ToString(),新的CultureInfo(hr-HR));
temp.Total = float.Parse(dr [Total]。ToString(),新的CultureInfo(hr-HR));
tempList.Add(temp);
}
}
conn.Close();
return tempList;
}




  1. 数据集将与模型的属性具有相同的名称。


  1. 数据集


  1. 最后可以将其添加到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());
    这个.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 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!

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

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