ich denke, Ihre Klassendefinition den Namen des List<MySubObject>
fehlt:?
public class MyObject
{
public string Name {get; set;}
public List<MySubObject> SubObjects {get; set;}
}
public class MySubObject
{
public string SubName {get; set;}
}
können Sie Schleife durch und füllen einen Datensatz (die Sie nicht wirklich brauchen subreports zu verwenden, UNeSS Ihre Daten komplexer ist, als Sie oben beschrieben haben):
DataSet ds = new DataSet();
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("SubReport");
foreach (MyObject myo in list_of_myobjects)
{
foreach (MySubObject myso in myo.SubObjects)
{
DataRow dr = dt.NewRow();
dr[0] = myo.Name;
dr[1] = myso.SubName;
dt.Rows.Add();
ds.Tables.Add(dt);
}
}
Dann wird Ihr Crystal Report Datenquelle auf dem Datensatz verweisen:
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
CrystalReport1 objRpt = new CrystalReport1();
objRpt.SetDataSource(ds.Tables[1]);
crystalReportViewer1.ReportSource = objRpt;
crystalReportViewer1.Refresh();
Das Beispiel, das ich gab, wurde für die Frage konstruiert - das sind nicht meine wirklichen Klassen, aber sind ähnlich. Ich habe nie Datensätze verwendet. Bis jetzt habe ich mit 'IEnumerable' gearbeitet, wo T 'MyObject' ist. Hat die Erstellung einer Datentabelle zuerst mehr Vorteile, als dass sie als Berichtsquelle verwendet wird? –
Von dem, was ich verstehe, sind Sie beschränkt, was Sie als Berichtsquelle übergeben können. Sie würden normalerweise Verbindungsdetails für irgendeine Form von Datenbank zur Verfügung stellen - aber basierend auf dem, was Sie übergeben möchten, ist ein Datensatz das einzige, was mir in den Sinn kommt –
Ich sollte auch hinzufügen - abhängig von der Komplexität und Flexibilität, die Sie wünschen haben Sie nicht um die Spaltennamen fest zu codieren - Sie können die Eigenschaften Ihrer Klasse durchlaufen –