2012-04-02 1 views
1

Angenommen, ich habe folgendes:Crystal Reports mit dem Report und SubReport

public class MyObject 
{ 
    public string Name {get; set;} 
    public List<MySubObject> SubObjects {get; set;} 
} 

public class MySubObject 
{ 
    public string SubName {get; set;} 
} 

Gibt es eine Möglichkeit ich einen Bericht und Unter Bericht für eine Liste von MyObjects (jeweils mit einer Liste von subreports zeigen einrichten können ihre MySubObjects jeweiligen

Antwort

1

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(); 
+0

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? –

+0

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 –

+0

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 –