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.