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

时间:2014-02-25 15:00:27

标签: c# binding dataset reportviewer

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

if (idRep.Equals("extraMove"))

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

Binding 但如果你有多个呢?我总是可以用另一个报表查看器创建另一个表单,但这不是一个选项(如果你有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...!");
        }

这是包含reportviewer的ReportForm.cs:

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

3 个答案:

答案 0 :(得分:6)

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

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; }
    }
}

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

示例:

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. 步骤是创建与模型中的属性具有相同名称的数据集。
  2. enter image description here

    1. 步骤创建将绑定数据集的报告。
    2. enter image description here

      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();
            }
        }
        
      2. 我希望这会有助于其他人加快速度。

        喝彩!

答案 1 :(得分:1)

我花了一些时间来解决同样的问题。我正在使用VS 2013,其中数据集通过报表表单中自动创建的BindingSource连接。如果您创建报告并添加所有必需的元素,一切正常。如果你(比如说)稍后添加一个表,那么BindingSources就会失步,或者没有创建。

编辑报表表单设计视图,单击ReportViewer对象并使用少量任务&#39;顶部r.h中的箭头。角。选择&#39;重新绑定数据源&#39;或者&#39;选择数据源&#39;检查它们是否正确绑定。

答案 2 :(得分:0)

要强制Visual Studio自动创建绑定源,您必须首先创建报告(.rdlc)。链接数据源后,当您添加组件(reportviewer)并使用图像中显示的报告名称链接组件时,一旦选择了报告,它将自动创建一个绑定源,其中包含您在使用时所使用的名称创造了设计。