【问题标题】:How to bind dynamically datasource to reportviewer on windows forms c#如何在windows窗体c#上动态绑定数据源到reportviewer
【发布时间】:2014-03-27 21:34:05
【问题描述】:

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

if (idRep.Equals("extraMove"))

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

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

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

【问题讨论】:

    标签: c# binding dataset reportviewer


    【解决方案1】:

    好的,想弄明白,昨天我找到了一个我可以接受的解决方案,所以我想和大家分享一下:

    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. 步骤是创建与模型属性同名的数据集。

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

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

    干杯!

    【讨论】:

    • 解释得很好,有时我觉得微软的一些技术还没有被完全使用
    • 请注意,您不需要创建与数据源具有相同参数的类,因为您可以直接从代码中的数据源访问强类型数据表。此外,当数据源文件位于文件夹中时,请确保将文件夹视为命名空间。
    • 感谢队友,但这是在很久以前的 2014 年完成的。现在我处于不同的位置,例如基础设施。但是,好的回复永远不会迟到;)还是谢谢。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多