我创建了充当报表加载器的窗体。我还通过报告向导创建了两个RDLC报告,并自动为这两个报告创建了数据集。现在我有两个数据集:sparcsn4DataSet.xsd和sparcsn4DataSet1.xsd,它们使用存储过程并传递两个参数(dateFrom / dateTo)。我的绑定数据集存在问题,具体取决于状态:
if (idRep.Equals("extraMove"))
如果您有一个报告,将数据集绑定到reportview非常容易。
但如果你有多个呢?我总是可以用另一个报表查看器创建另一个表单,但这不是一个选项(如果你有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();
}
}
}
答案 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;
}
最后您可以将其添加到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();
}
}
我希望这会有助于其他人加快速度。
喝彩!
答案 1 :(得分:1)
我花了一些时间来解决同样的问题。我正在使用VS 2013,其中数据集通过报表表单中自动创建的BindingSource连接。如果您创建报告并添加所有必需的元素,一切正常。如果你(比如说)稍后添加一个表,那么BindingSources就会失步,或者没有创建。
编辑报表表单设计视图,单击ReportViewer对象并使用少量任务&#39;顶部r.h中的箭头。角。选择&#39;重新绑定数据源&#39;或者&#39;选择数据源&#39;检查它们是否正确绑定。
答案 2 :(得分:0)
要强制Visual Studio自动创建绑定源,您必须首先创建报告(.rdlc)。链接数据源后,当您添加组件(reportviewer)并使用图像中显示的报告名称链接组件时,一旦选择了报告,它将自动创建一个绑定源,其中包含您在使用时所使用的名称创造了设计。