วิธีทำงานกับ Structured Document Tags ใน .NET

วิธีทำงานกับ Structured Document Tags ใน .NET

คู่มือนี้จะแสดงวิธีการแทรก, กำหนดค่า, ค้นหา, ลบ, และผูกข้อมูลกับแท็กเอกสารที่มีโครงสร้าง (content controls) ใน Aspose.Words FOSS สำหรับ .NET, โดยใช้ StructuredDocumentTag คลาสใน Aspose.Words.Markup เนมสเปซ. ครอบคลุมประเภทของ content-control ที่ DocumentBuilder สามารถแทรก, ตั้งค่าเนื้อหาเฉพาะประเภทเช่น สถานะของเช็คบ็อกซ์หรือ ตัวเลือกในดรอปดาวน์, ค้นหาคอนโทรลโดยแท็กหรือหัวเรื่อง, ลบคอนโทรลพร้อมหรือไม่มีเนื้อหา, และแมปคอนโทรลกับข้อมูล XML แบบกำหนดเอง.

คู่มือแบบขั้นตอนต่อขั้นตอน

ขั้นตอนที่ 1: ติดตั้งแพ็กเกจ

Aspose.Words FOSS for .NET ยังไม่ได้เผยแพร่แพ็กเกจ NuGet – ให้สร้างไลบรารีจากซอร์สโค้ดแทน. คัดลอก https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git, จากนั้นสร้าง Aspose.Words.sln ในคอนฟิกูเรชัน Release ด้วย .NET SDK และอ้างอิงแอสเซมบลี Aspose.Words ที่ได้จากโปรเจกต์ของคุณ. ไลบรารีนี้มุ่งเป้าไปที่ .NET Standard 2.0, ดังนั้นมันทำงานบน .NET Framework 4.6.2+ และ .NET 6/8/10.


ขั้นตอนที่ 2: นำเข้าคลาสที่จำเป็น

เพิ่มคำสั่ง using Aspose.Words; สำหรับ Document และ DocumentBuilder, และเพิ่มคำสั่ง using Aspose.Words.Markup; สำหรับ StructuredDocumentTag, SdtType, SdtListItem, SdtListItemCollection, XmlMapping, และคลาส content-control อื่น ๆ ที่คู่มือนี้ครอบคลุม.


ขั้นตอนที่ 3: ตรวจสอบประเภท Content-Control ที่คุณสามารถแทรกได้

ก่อนทำการแทรก ให้ตรวจสอบว่า SdtType เป้าหมายเป็นหนึ่งในเจ็ดประเภทที่ DocumentBuilder.InsertStructuredDocumentTag(SdtType) ยอมรับหรือไม่: PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture และ Date. RepeatingSection และ RepeatingSectionItem ไม่สามารถแทรกที่เคอร์เซอร์ข้อความด้วยวิธีนี้ – พวกมันจะห่อหุ้มย่อหน้าทั้งหมดหรือแถวตารางแทน. ค่าที่เหลือของ SdtType ที่อาจปรากฏในไฟล์ Word แต่ไม่ได้แสดงใน UI ของ Word เป็นประเภทที่สามารถแทรกได้ – None, Bibliography, Citation, Equation, BuildingBlockGallery, DocPartObj, Group และ EntityPicker – ไม่ได้รับการยอมรับโดยวิธีการแทรกนี้เลย.


ขั้นตอนที่ 4: แทรก Content Control ที่เคอร์เซอร์

เรียก DocumentBuilder.InsertStructuredDocumentTag(SdtType) ด้วยหนึ่งในเจ็ดประเภทที่รองรับเพื่อแทรกคอนโทรลใหม่ที่ตำแหน่งเคอร์เซอร์ปัจจุบันของตัวสร้าง; การเรียกนี้จะคืนค่า StructuredDocumentTag ใหม่. ตั้งค่า Tag และ Title บนคอนโทรลที่คืนค่าเพื่อให้มีสตริงระบุตัวที่ผู้เขียนเห็นใน Word, และตั้งค่า PlaceholderName (ซึ่งรองรับโดย Placeholder BuildingBlock) สำหรับข้อความพรอมท์ที่ Word แสดงเมื่อคอนโทรลว่าง – IsShowingPlaceholderText จะรายงานว่าพรอมท์นั้นกำลังแสดงอยู่หรือไม่.


ขั้นตอนที่ 5: กำหนดค่าข้อมูลตามประเภท

สำหรับคอนโทรลเช็คบ็อกซ์ ให้อ่านหรือกำหนดค่า StructuredDocumentTag.Checked, และเรียก SetCheckedSymbol() / SetUncheckedSymbol() เพื่อปรับแต่ง glyph ที่แสดงสำหรับแต่ละสถานะ. สำหรับคอนโทรลวันที่, ตั้งค่า FullDate, โดยที่ DateDisplayFormat และ DateDisplayLocale ควบคุมวิธีการแสดงผล, DateStorageFormat (SdtDateStorageFormat) ควบคุมวิธีการเก็บเมื่อผูกกับข้อมูล XML, และ CalendarType (SdtCalendarType) เลือกระบบปฏิทิน. สำหรับรายการดรอปดาวน์หรือคอมโบบ็อกซ์, เติมข้อมูล ListItems – ซึ่งเป็น SdtListItemCollection ของ SdtListItem (DisplayText, Value) – ก่อนที่จะตั้งค่า SelectedValue เพื่อเลือกตัวเลือกที่ใช้งาน. สำหรับคอนโทรลข้อความธรรมดา, Multiline คือคุณสมบัติ bool บน StructuredDocumentTag ที่สามารถตั้งค่าเพื่อกำหนดคอนโทรล.


ขั้นตอนที่ 6: การควบคุมลักษณะและการล็อก

ตั้งค่า Appearance (SdtAppearance) เพื่อควบคุมว่าคอนโทรลจะถูกจำกัดรูปแบบอย่างไรใน Word, และตั้งค่า Color เพื่อกำหนดสีไฮไลท์. ContentsFont และ EndCharacterFont ควบคุมฟอนต์ที่ใช้กับเนื้อหาของคอนโทรลและอักขระสิ้นท้ายของมัน. LockContentControl และ LockContents เป็นสวิตช์อิสระ – ตั้งค่า LockContentControl เพื่อบล็อกการลบคอนโทรลเอง, และ LockContents เพื่อบล็อกการแก้ไขสิ่งที่อยู่ภายในโดยไม่กระทบต่ออีกอัน.


ขั้นตอนที่ 7: ค้นหาและลบ Content Controls

อ่าน Range.StructuredDocumentTags – ซึ่งเป็น StructuredDocumentTagCollection ที่มีขอบเขตอยู่ในช่วงนั้น – และเรียก GetById(), GetByTag() หรือ GetByTitle() เพื่อค้นหาคอนโทรลเฉพาะ, หรือใช้ Remove() / RemoveAt() บนคอลเลกชันเพื่อเอาออกโดยอ้างอิงหรือดัชนี. สำหรับคอนโทรลแต่ละตัว, เรียก Remove() เพื่อลบคอนโทรลพร้อมกับเนื้อหาของมัน, RemoveSelfOnly() เพื่อลบเฉพาะตัวหุ้มโดยคงเนื้อหาไว้ในเอกสาร, หรือ Clear() เพื่อล้างเนื้อหาในขณะที่คอนโทรลยังคงอยู่.


ขั้นตอนที่ 8: ผูกคอนโทรลกับข้อมูล XML ที่กำหนดเอง

อ่าน StructuredDocumentTag.XmlMapping – ซึ่งเป็นอินสแตนซ์ของ XmlMapping – และเรียก SetMapping(customXmlPart, xPath, prefixMapping) เพื่อผูกคอนโทรลกับส่วน XML ที่กำหนดเองที่มีอยู่แล้วในที่เก็บข้อมูล XML ที่กำหนดเองของเอกสาร, โดยใช้การแสดง XPath เพื่อเลือกองค์ประกอบที่ผูกไว้. XmlMapping.IsMapped รายงานว่าการผูกกำลังทำงานหรือไม่, CustomXmlPart และ StoreItemId ระบุตำแหน่งข้อมูลที่ผูก, และ Delete() ลบการแมป.


ขั้นตอนที่ 9: จัดการ Content Controls ที่ครอบคลุมหลายส่วน

Content control ที่ครอบคลุมมากกว่าหนึ่งส่วนของเอกสาร – รายงานโดย IsMultiSection – จะไม่ถูกแทนด้วยโหนด StructuredDocumentTag เพียงโหนดเดียว แต่ด้วยคู่ StructuredDocumentTagRangeStart / StructuredDocumentTagRangeEnd ที่เชื่อมต่อผ่าน StructuredDocumentTagRangeStart.RangeEnd. เขียนโปรแกรมโดยอิงอินเทอร์เฟซร่วม IStructuredDocumentTag (Tag, Title, Placeholder, PlaceholderName, Appearance, IsShowingPlaceholderText, RemoveSelfOnly()) เมื่อโค้ดต้องจัดการรูปแบบโหนดเดียวและรูปแบบช่วงอย่างสอดคล้องกัน, แทนที่จะสาขาตามชนิดที่เป็นจริง.

ปัญหาทั่วไปและการแก้ไข

InsertStructuredDocumentTag โยน NotImplementedException ที่ร้องขอ SdtType – ตัวอย่างเช่น Citation, Equation, หรือ BuildingBlockGallery – ไม่ใช่หนึ่งในเจ็ดประเภทที่สามารถแทรกได้ ใช้ PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture, หรือ Date แทน.

InsertStructuredDocumentTag ทำให้เกิด InvalidOperationException RepeatingSection or RepeatingSectionItem ถูกร้องขอที่เคอร์เซอร์ข้อความ. สองประเภทนี้ห่อหุ้มย่อหน้าทั้งหมดหรือแถวตารางเต็มแทนที่จะถูกแทรกที่ตำแหน่งเคอร์เซอร์.

การลบ content control ยังลบข้อความภายในด้วย Remove() ลบคอนโทรลและเนื้อหาภายในพร้อมกัน. เรียก RemoveSelfOnly() แทนเพื่อเก็บเนื้อหาในเอกสารและลบเฉพาะตัวห่อเท่านั้น.

ช่องทำเครื่องหมายไม่แสดงสัญลักษณ์ที่คาดหวัง อักขระ glyph ที่เลือกและไม่เลือกแบบกำหนดเองไม่เคยถูกตั้งค่า. เรียก SetCheckedSymbol() and SetUncheckedSymbol() บนคอนโทรล.

รายการดรอปดาวน์หรือคอมโบบ็อกซ์แสดงไม่มีตัวเลือก ListItems ไม่เคยถูกเติมข้อมูล. เพิ่ม SdtListItem รายการลงในคอนโทรลของ ListItems คอลเลกชันก่อนคาดว่าจะมีตัวเลือกปรากฏขึ้น, แล้วตั้งค่า SelectedValue เพื่อเลือกอันที่ใช้งานอยู่.

คำถามที่พบบ่อย

ฉันสามารถแทรกประเภทของ content-control ไหนได้โดยตรงด้วย DocumentBuilder?

PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture และ Date. ค่าของ SdtType อื่น ๆ ไม่ได้รับการสนับสนุนโดย InsertStructuredDocumentTag().

ฉันจะหา content controls ทั้งหมดที่มีแท็กเฉพาะได้อย่างไร?

อ่าน Range.StructuredDocumentTags แล้วเรียก GetByTag() หรือ GetByTitle() / GetById() หากจับคู่กับตัวระบุเหล่านั้นแทน.

ฉันจะลบ content control แต่รักษาเนื้อหาของมันในเอกสารไว้ได้อย่างไร?

เรียก StructuredDocumentTag.RemoveSelfOnly() แทน Remove().

ฉันจะผูก content control กับข้อมูล XML แบบกำหนดเองได้อย่างไร?

เรียก XmlMapping.SetMapping() บน XmlMapping ของคอนโทรล โดยชี้ไปที่ส่วน XML แบบกำหนดเองที่มีอยู่และนิพจน์ XPath ภายในนั้น.

content control ที่ข้ามหลายส่วนแตกต่างจากแบบปกติอย่างไร?

มันถูกแทนด้วยคู่ StructuredDocumentTagRangeStart / StructuredDocumentTagRangeEnd แทนโหนด StructuredDocumentTag เพียงอันเดียว; ทั้งสองรูปแบบทำงานตาม IStructuredDocumentTag ดังนั้น IsMultiSection จะบอกคุณว่าคุณกำลังทำงานกับรูปแบบใด.

ดูเพิ่มเติม

 ภาษาไทย