Dom rekursiv durchlaufen und Content holen

Hallo!

Folgender Code sollte die freien Inhaltstabellen eines Berichtscontainers durchlaufen (was auch funktioniert) und dabei im Falle von geschachtelten Tabellen diese ebenfalls rekursiv durchlaufen:

                foreach (SubItemStaticTable table in container.SubItems.OfType<SubItemStaticTable>())
                {
                    foreach (TableLineBase data in table.Lines.Data)
                    {
                        foreach (TableField field in data.Fields)
                        {
                            if (field is TableFieldText)
                            {
                                assetContent.AppendFormat("{0} ", ((TableFieldText)field).Contents);
                            }
                            else if (field is TableFieldDrawing)
                            {
                                assetContent.AppendFormat("{0} ", ((TableFieldDrawing)field).Contents);
                            }
                            else if (field is TableFieldTable)
                            {
                                ((TableFieldTable)field).GetSubTableAssetItemIDs(assetContent);
                            }
                        }
                    }
                }

Das Ganze habe ich an folgender Struktur probiert:

Report_Zeilendefinition

Dabei tritt folgendes Verhalten auf:

Die freie Inhaltstabelle wird nicht als Typ "TableFieldTable) sondern als Typ TableFieldText erkannt. Dadurch funktioniert auch das weitere rekursive Durchlaufen geschachtelter Tabellen nicht. Vermutlich bin ich das falsch angegangen, habe aber nichts dar├╝ber gefunden, wie man das richtig machen k├Ânnte.

├ťber Hilfe w├╝rde ich mich sehr freuen!

Hallo Herr Polaschek,

grunds├Ątzlich sind Sie auf dem richtigen Pfad. ├ťbergeben Sie f├╝r das LL-Objekt eine DataSource? Falls nicht, dann d├╝rfte das der Knackpunkt sein. Ohne Datenquelle geht List & Label in einen Modus, in welchen die Tabelle in Tabelle nicht bekannt ist und liefert daher den scheinbar falschen Typen zur├╝ck. ├ťbergeben Sie in diesem Fall einfach eine leere Dummy Datenquelle an das LL-Objekt:

using (ListLabel ll = new ListLabel())
      {
           ll.DataSource = new List<String> { "test"};
           ProjectList proj = new ProjectList(ll);
           proj.Open(...)
           <Hier folgt Ihr DOM-Code>

Dann ist List & Label im ÔÇťDataProviderÔÇŁ-Modus und kann auch mit der Tabelle in der Tabelle etwas anfangen. Anschlie├čend sollte auch der Typ SubTableList geliefert werden.

Hallo!

Vielen Dank, das hat geklappt. Muss man nat├╝rlich wissen, dass man hier sozusagen das Vorhandensein einer DataSource vorgaukeln muss. Aber ja, nun werden die Feldtypen richtig erkannt.

1 Like

Sch├Ân, dass es funktioniert. F├╝r uns hei├čt es ÔÇťAuftrag erkanntÔÇŁ. Diese Information wird sich in den Handb├╝chern der kommenden Versionen (ab LL28) wiederfinden.

Freut mich zu lesen, dass das auch in der Dokumentation ber├╝cksichtigt wird.

Wichtig w├Ąre hier aber auch, dass es so platziert wird, dass man es auch findet. Die Dokumentation ist jetzt schon sehr umfangreich (was gut ist) aber wenn man ein Problem hat und eine L├Âsung sucht, dann ist es ziemlich m├╝hsam, genau das Beispiel zu finden in dem das vielleicht vorkommt. Man wei├č auch h├Ąufig nicht, nach welchem Begriff man suchen soll und ob das eher in im Designerhandbuch oder eher in der Programmierreferenz zu finden sein k├Ânnte.

Konstruktives Feedback ist immer willkommen. Daher m├Âchten wir Sie nat├╝rlich nach Ihrer Meinung fragen, wenn es ok ist. Wo genau w├╝rden Sie suchen bzw. einen Hinweis erwarten? Wir planen die Doku bei ignoreErrors entsprechend zu erg├Ąnzen. W├╝rde das f├╝r Sie passen?

Hallo!

Also finden w├╝rde ich das dort vermutlich nicht. Suchen w├╝rde ich danach eher in der Programmierer Referenz im Kapitel ├╝ber das DOM. So als eingerahmter, hervorgehobener Hinweis w├╝rde das gut passen, finde ich.

┬ę combit GmbH