Wie man mit Structured Document Tags in .NET arbeitet
Dieses Handbuch zeigt, wie man strukturierte Dokumenttags (Inhaltssteuerelemente) einfügt, konfiguriert, findet, entfernt und Daten daran bindet in Aspose.Words FOSS für .NET, mit dem StructuredDocumentTag Klasse im Aspose.Words.Markup Namensraum. Es behandelt, welche Inhaltssteuerelementtypen DocumentBuilder einfügen können, das Festlegen von typspezifischem Inhalt wie dem Status von Kontrollkästchen oder Auswahlmöglichkeiten in Dropdown-Listen, das Auffinden von Steuerelementen nach Tag oder Titel, das Entfernen eines Steuerelements mit oder ohne dessen Inhalt sowie das Zuordnen eines Steuerelements zu benutzerdefinierten XML-Daten.
Schritt-für-Schritt-Anleitung
Schritt 1: Paket installieren
Aspose.Words FOSS für .NET veröffentlicht noch kein NuGet-Paket – bauen Sie die Bibliothek stattdessen aus dem Quellcode. Klonen Sie https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git, bauen Sie dann Aspose.Words.sln in der Release-Konfiguration mit dem .NET-SDK und binden Sie die resultierende Aspose.Words-Assembly in Ihr Projekt ein. Die Bibliothek zielt auf .NET Standard 2.0 ab, sodass sie auf .NET Framework 4.6.2+ und .NET 6/8/10 läuft.
Schritt 2: Erforderliche Klassen importieren
Fügen Sie eine using Aspose.Words;-Direktive für Document und DocumentBuilder sowie eine using Aspose.Words.Markup;-Direktive für StructuredDocumentTag, SdtType, SdtListItem, SdtListItemCollection, XmlMapping und die anderen Content-Control-Klassen, die in diesem Handbuch behandelt werden, hinzu.
Schritt 3: Prüfen, welche Content-Control-Typen Sie einfügen können
Bevor Sie einfügen, prüfen Sie, ob das Ziel SdtType einer der sieben von DocumentBuilder.InsertStructuredDocumentTag(SdtType) akzeptierten Typen ist: PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture und Date. RepeatingSection und RepeatingSectionItem können mit dieser Methode nicht an einem Textcursor eingefügt werden – sie umschließen stattdessen ganze Absätze oder Tabellenzeilen. Die übrigen SdtType-Werte, die in einer Word-Datei vorkommen können, aber in der Word-Benutzeroberfläche nicht als einfügbar angezeigt werden – None, Bibliography, Citation, Equation, BuildingBlockGallery, DocPartObj, Group und EntityPicker – werden von dieser Einfügemethode überhaupt nicht akzeptiert.
Schritt 4: Ein Content-Control am Cursor einfügen
Rufen Sie DocumentBuilder.InsertStructuredDocumentTag(SdtType) mit einem der sieben unterstützten Typen auf, um ein neues Control an der aktuellen Cursorposition des Builders einzufügen; der Aufruf gibt das neue StructuredDocumentTag zurück. Setzen Sie Tag und Title auf dem zurückgegebenen Control, um ihm die Kennzeichnungszeichenfolgen zu geben, die Autoren in Word sehen, und setzen Sie PlaceholderName (unterstützt durch ein Placeholder BuildingBlock) für den Hinweistext, den Word anzeigt, während das Control leer ist – IsShowingPlaceholderText gibt an, ob dieser Hinweis derzeit angezeigt wird.
Schritt 5: Typbezogenen Inhalt konfigurieren
Bei einem Checkbox-Control lesen oder setzen Sie StructuredDocumentTag.Checked und rufen SetCheckedSymbol() / SetUncheckedSymbol() auf, um die für jeden Zustand angezeigten Glyphen anzupassen. Bei einem Datums-Control setzen Sie FullDate, wobei DateDisplayFormat und DateDisplayLocale steuern, wie es dargestellt wird, DateStorageFormat (SdtDateStorageFormat) steuert, wie es gespeichert wird, wenn es an XML-Daten gebunden ist, und CalendarType (SdtCalendarType) wählt das Kalendersystem aus. Für eine Dropdown-Liste oder ein Kombinationsfeld füllen Sie ListItems – ein SdtListItemCollection von SdtListItem (DisplayText, Value) – bevor Sie SelectedValue setzen, um die aktive Auswahl zu bestimmen. Für ein Klartext-Control ist Multiline eine bool-Eigenschaft von StructuredDocumentTag, die zur Konfiguration des Controls gesetzt werden kann.
Schritt 6: Erscheinungsbild und Sperrung des Controls
Setzen Sie Appearance (SdtAppearance), um zu steuern, wie das Control in Word optisch abgegrenzt wird, und Color, um seine Hervorhebungsfarbe festzulegen. ContentsFont und EndCharacterFont steuern die auf den Inhalt des Controls angewendete Schriftart bzw. das abschließende Zeichen. LockContentControl und LockContents sind unabhängige Schalter – setzen Sie LockContentControl, um das Löschen des Controls selbst zu verhindern, und LockContents, um die Bearbeitung des Inhalts zu blockieren, ohne den anderen zu beeinflussen.
Schritt 7: Inhaltssteuerelemente finden und entfernen
Lesen Sie Range.StructuredDocumentTags – ein StructuredDocumentTagCollection mit diesem Bereich – und rufen Sie GetById(), GetByTag() oder GetByTitle() auf, um ein bestimmtes Steuerelement zu finden, oder Remove() / RemoveAt() in der Sammlung, um eines nach Referenz oder Index zu entfernen. Bei einem einzelnen Steuerelement rufen Sie Remove() auf, um das Steuerelement zusammen mit seinem Inhalt zu löschen, RemoveSelfOnly(), um nur den Wrapper zu löschen und den Inhalt im Dokument zu behalten, oder Clear(), um den Inhalt zu leeren, während das Steuerelement selbst an Ort und Stelle bleibt.
Schritt 8: Ein Steuerelement an benutzerdefinierte XML-Daten binden
Lesen Sie StructuredDocumentTag.XmlMapping – eine XmlMapping-Instanz – und rufen Sie SetMapping(customXmlPart, xPath, prefixMapping) auf, um das Steuerelement an einen bereits im benutzerdefinierten XML-Datenspeicher des Dokuments vorhandenen benutzerdefinierten XML-Teil zu binden, wobei ein XPath-Ausdruck verwendet wird, um das gebundene Element auszuwählen. XmlMapping.IsMapped gibt an, ob eine Bindung derzeit aktiv ist, CustomXmlPart und StoreItemId identifizieren den gebundenen Datenteil, und Delete() entfernt die Zuordnung.
Schritt 9: Inhaltssteuerelemente behandeln, die mehrere Abschnitte umfassen
Ein Inhaltssteuerelement, das mehr als einen Dokumentabschnitt umfasst – gemeldet von IsMultiSection – wird nicht durch einen einzelnen StructuredDocumentTag-Knoten, sondern durch ein StructuredDocumentTagRangeStart / StructuredDocumentTagRangeEnd-Paar dargestellt, das über StructuredDocumentTagRangeStart.RangeEnd verbunden ist. Programmieren Sie gegen die gemeinsame IStructuredDocumentTag-Schnittstelle (Tag, Title, Placeholder, PlaceholderName, Appearance, IsShowingPlaceholderText, RemoveSelfOnly()), wenn Code sowohl die Einzelknoten- als auch die Bereichsformen einheitlich behandeln muss, anstatt je nach konkretem Typ zu verzweigen.
Häufige Probleme und Lösungen
InsertStructuredDocumentTag wirft NotImplementedException Die angeforderte SdtType – zum Beispiel Citation, Equation, oder BuildingBlockGallery – ist nicht einer der sieben einfügbaren Typen. Verwenden Sie PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture, oder Date stattdessen.
InsertStructuredDocumentTag wirft InvalidOperationException RepeatingSection or RepeatingSectionItem wurde an einem Textcursor angefordert. Diese beiden Typen umschließen ganze Absätze oder Tabellenzeilen, anstatt an einer Cursorposition eingefügt zu werden.
Das Entfernen eines Inhaltssteuerelements löscht auch den darin enthaltenen Text Remove() löscht das Steuerelement und dessen Inhalt zusammen. Rufen Sie RemoveSelfOnly() stattdessen, um den Inhalt im Dokument zu belassen und nur den Wrapper zu entfernen.
Das Kontrollkästchen zeigt nicht das erwartete Symbol Benutzerdefinierte aktivierte und deaktivierte Glyphen wurden nie gesetzt. Rufen Sie SetCheckedSymbol() and SetUncheckedSymbol() am Steuerelement auf.
Eine Dropdown-Liste oder Kombinationsfeld zeigt keine Auswahlmöglichkeiten ListItems wurde nie befüllt. Fügen Sie SdtListItem Einträge zum Steuerelement hinzu ListItems Sammlung, bevor die Auswahlmöglichkeiten erscheinen, dann festlegen SelectedValue um das aktive auszuwählen.
Häufig gestellte Fragen
Welche Inhaltssteuerelementtypen kann ich direkt mit DocumentBuilder einfügen?
PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture und Date. Andere SdtType-Werte werden von InsertStructuredDocumentTag() nicht unterstützt.
Wie finde ich alle content controls mit einem bestimmten Tag?
Lese Range.StructuredDocumentTags und rufe GetByTag() auf, oder GetByTitle() / GetById(), wenn stattdessen nach diesen Bezeichnern abgeglichen wird.
Wie entferne ich ein content control, aber behalte dessen Inhalt im Dokument bei?
Rufe StructuredDocumentTag.RemoveSelfOnly() anstelle von Remove() auf.
Wie binde ich ein content control an benutzerdefinierte XML-Daten?
Rufe XmlMapping.SetMapping() auf dem XmlMapping des Controls auf und weise es auf einen vorhandenen benutzerdefinierten XML-Teil sowie einen XPath-Ausdruck darin hin.
Worin unterscheidet sich ein content control, das mehrere Abschnitte umfasst, von einem normalen?
Es wird als StructuredDocumentTagRangeStart / StructuredDocumentTagRangeEnd-Paar dargestellt, anstatt als einzelner StructuredDocumentTag-Knoten; beide Formen implementieren IStructuredDocumentTag, sodass IsMultiSection angibt, mit welcher Form Sie arbeiten.