Eine Datenquelle gleichzeitig als Variable und für Felder

Hallo zusammen,

wir befinden uns gerade in der Evaluierungsphase eines Reporting-Tools und testen dafür u.a. List & Label.

Beim Testen sind wir auf ein Problem gestoßen, dass wir nicht lösen können:
Wie möchten das .Net-Framework (u.a. V5, V6, V7) mit C# verwenden, um den Designer zu parametrisieren. Dazu haben wir uns einige Beispiele angesehen.

Nun zu unserem Problem:

Wir nutzen einen ObjectDataProvider , um Daten für einen Report zu generieren.
Folgen wir einigen Beispielen klappt das auch soweit: unsere DatenQuelle ist über “Felder” zugreifbar und wir können Tabellen aufbauen.
Nun bestand allerdings der Wunsch auch normale Textfelder mit Daten aus der selben Datenquelle zu befüllen. Das funktioniert nicht, da die Datenquelle nicht unter “Variablen” (wie von Text anscheinend erwartet) zu finden ist.
Wir haben auch mit dem Parameter “AddVarsToFields” von ListLabel gearbeitet, leider ohne Erfolg.

Anbei noch ein Auszug unserer Konfiguration via C#:
Nur in “Feldern” sichtbar:

            listLabelComponent.DataSource = objectDataProvider;
            //this.listLabelComponent.DataMember = "BaseData";
            this.listLabelComponent.AutoMasterMode = LlAutoMasterMode.AsVariables;
            this.listLabelComponent.AddVarsToFields = true;

Nur in “Variablen” sichtbar:

            listLabelComponent.DataSource = objectDataProvider;
            this.listLabelComponent.DataMember = "BaseData";
            this.listLabelComponent.AutoMasterMode = LlAutoMasterMode.AsVariables;
            this.listLabelComponent.AddVarsToFields = true;

Vielen Dank für ihr Feedback.

Viele Grüße
Thomas Günther

Hallo Thomas und herzlich willkommen in unserem Forum :slight_smile:.

Der Code sieht an sich schon prima aus, vermutlich müsste nur das Objekt leicht angepasst werden. Wenn du den AutoMasterMode auf AsVariables setzt, wird alles, was in dem angegebenen DataMember steckt als Variablen angemeldet, und alles “unterhalb” (also z. B. eine List<T>, die als Member vorhanden ist) als Felder. Der Klassiker wäre eine Klasse “Invoice” mit einem “InvoiceItems” - Member.

Wenn es dagegen wirklich sowohl Felder als auch Variablen aus den identischen Objektmembern braucht kannst du im AutoDefineField-Event (der für jedes Feld aufgerufen wird) einfach per (sender as ListLabel).Variables.Add(...) die Felder (du bekommst Namen und Inhalt in den EventArgs) als Variable “spiegeln”.

Hilft das schon weiter?

Hallo Jochen,

vielen Dank für die schnelle Rückmeldung. Ich werde das ausprobieren. Ich hatte daraufhin noch gesehen, dass mein “BaseData”-Objekt falsch aufgebaut ist. Die Daten für die Felder müssen soweit ich das gesehen hatte in “List”-Objekten gehalten werden. Bei mir sind das bislang für einen ersten Test einfave, normale Objektreferenzen:

var baseData = new BaseData();
baseData.Company = new Company();
baseData.Company.Name = "Test Company";
baseData.Company.Address = new Address();
baseData.Company.Address.Name = "Test Company GmbH";
baseData.Company.Address.Street = "Kistlerhofstrasse";
baseData.Company.Address.StreetNumber = "42";
baseData.Company.Address.ZipCode = "81379";
baseData.Company.Address.CityName = "München";
baseData.Company.Address.CountryName = "Deutschland";

baseData.Customer = new Customer();
baseData.Customer.Name = "Testkunde";
baseData.Customer.Address = new Address();
baseData.Customer.Address.Name = "Testkunde";
baseData.Customer.Address.Street = "Teststraße";
baseData.Customer.Address.StreetNumber = "1";
baseData.Customer.Address.ZipCode = "12345";
baseData.Customer.Address.CityName = "Teststadt";
baseData.Customer.Address.CountryName = "Deutschland";

baseData.AuthorizedTechnician = new AuthorizedTechnician();
baseData.AuthorizedTechnician.FirstName = "Max";
baseData.AuthorizedTechnician.LastName = "Mustermann";
baseData.AuthorizedTechnician.CompanyName = "Testfirma";
baseData.AuthorizedTechnician.Address = new Address();
baseData.AuthorizedTechnician.Address.Name = "Testfirma";
baseData.AuthorizedTechnician.Address.Street = "Teststraße";
baseData.AuthorizedTechnician.Address.StreetNumber = "1";
baseData.AuthorizedTechnician.Address.ZipCode = "12345";
baseData.AuthorizedTechnician.Address.CityName = "Teststadt";
baseData.AuthorizedTechnician.Address.CountryName = "Deutschland";

Ich denke das wäre schonmal ein erster Ansatz. Ansonsten werde ich die andere genannte Idee ausprobieren.

Viele Grüße,
Thomas

Alles klar - schreib hier gerne nochmal wenn du für dich die Lösung gefunden hast oder noch mehr Infos brauchst. Wir helfen gerne :+1:.