我以前没用过水晶报表。但是对于一个项目,由于打印问题,我需要使用它而不是 fastreport。我已经尝试解决我的问题好几个小时,但还没有找到任何解决方案。
好吧,我有两个类可以用于水晶报表。我想创建一个账单报告。
我从我的数据库中组织了一些数据并将它们放入我的这些类中。
public class ReportInfo
{
public DateTime Date { get; set; }
public string BillNumber { get; set; }
public string Address { get; set; }
public string BillAddress { get; set; }
public string BillOwner { get; set; }
public string TaxNumberIDNumber { get; set; }
public List<ReportProduct> Products { get; set; }
public string PaymentType { get; set; }
public string MoneyWithText { get; set; }
}
public class ReportProduct
{
public string ProductInfo { get; set; }
public double Amount { get; set; }
public string ProductCode { get; set; }
public double Tax { get; set; }
public double Price { get; set; }
}
如您所见,reportinfo 类中有一个账单类(报告信息)和一个产品列表(报告产品)。
我想创建一个报告,该报告将在标题上具有某些值(账单编号、日期...),在详细信息区域具有某些值(产品信息)。
在这里,我为一张账单做了这件事(我也不知道如何将账单放在报告查看器中)
var serialID = Convert.ToInt32(dgBillSerials.SelectedRows[0].Cells[0].Value);
var bills= BillsFromDatabase.Bills.Where(b => b.BillSerialID == serialID && (b.BillNumber>=txtFirstBillNumber.Value && b.BillNumber<=txtLastBillNumber.Value)).ToList();
var products = BillsFromDatabase.Products.Where(p => p.BillID == bills[0].ID).ToList();
ReportInfo ri = new ReportInfo();
ri.Address = bills[0].Address;
ri.BillAddress = bills[0].BillAddress;
ri.BillNumber =bills[0].SerialNumber + bills[0].BillNumber.ToString();
ri.BillOwner = bills[0].OwnerType == "sirket" ? bills[0].PersonTitle : bills[0].Name;
ri.Date = bills[0].BillDate;
ri.MoneyWithText = "deneme";
ri.PaymentType = bills[0].PaymentType;
ri.TaxNumberIDNumber=bills[0].OwnerType=="sirket"?bills[0].TaxDepartment + " " + bills[0].TaxNumber:bills[0].NationalID;
ri.Products = new List<ReportProduct>();
double sum=0;
foreach (var product in products)
{
sum += product.Price;
ri.Products.Add(new ReportProduct()
{
Price = product.Price,
ProductCode = product.ProductCode,
ProductInfo = product.ProductInfo,
Amount = Math.Round((product.Price/118)*100,2),
Tax =Math.Round( product.Price -((product.Price / 118) * 100),2)
});
}
ri.MoneyWithText = Utils.MoneyToText(sum);
ReportDocument crystalReport = new ReportDocument();
crystalReport.Load(@"..my path....\BillCrystalReport.rpt");
crystalReport.SetDataSource(ri);
crystalReportViewer1.ReportSource = crystalReport;
当我运行该代码时,在 crystalReport.SetDataSource(ri) 上抛出“源对象无效”的异常;
我知道这看起来不公平,但我不知道如何在我的水晶报告中实现两个表格。当我将我的两个类都添加到水晶报告中时,它看起来像这样
我为一节课做了这个,还可以。但是这个教程没有谈论多个数据对象。
http://msdn.microsoft.com/en-us/library/ms227595(v=vs.80).aspx
ps:使用vs 2012和fw 4.0并安装sap水晶报告。