如何在Windows窗体c#上动态绑定数据源到reportviewer

dov*_*091 1 c# binding reportviewer dataset

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

if (idRep.Equals("extraMove"))
Run Code Online (Sandbox Code Playgroud)

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

捆绑 但如果你有多个呢?我总是可以使用另一个reportviewer创建另一个表单,但这不是一个选项(如果你有10个报表/数据集),这绝对是不可能的?

应该有办法将数据集绑定到reportviewer ...有没有人有想法,我如何根据状态解决绑定问题?

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...!");
        }
Run Code Online (Sandbox Code Playgroud)

这是ReportForm.cs上有reportviewer:

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();
    }
    }
   }
Run Code Online (Sandbox Code Playgroud)

dov*_*091 7

好的,试图搞清楚,昨天我找到了一个我可以接受的解决方案,所以我想与其他人分享:

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

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

例:

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;
    }
Run Code Online (Sandbox Code Playgroud)
  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());
            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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我希望这有助于其他人加快速度.

干杯!