Cách làm việc với Thẻ tài liệu có cấu trúc trong .NET
Hướng dẫn này chỉ cách chèn, cấu hình, tìm, xóa và liên kết dữ liệu tới các thẻ tài liệu có cấu trúc (điều khiển nội dung) trong Aspose.Words FOSS cho .NET, sử dụng StructuredDocumentTag lớp trong Aspose.Words.Markup namespace. Nó bao quát những loại điều khiển nội dung DocumentBuilder có thể chèn, thiết lập nội dung đặc thù cho từng loại như trạng thái hộp kiểm hoặc các lựa chọn trong danh sách thả xuống, định vị các điều khiển bằng thẻ hoặc tiêu đề, xóa một điều khiển có hoặc không có nội dung của nó, và ánh xạ một điều khiển tới dữ liệu XML tùy chỉnh.
Hướng dẫn từng bước
Bước 1: Cài đặt gói
Aspose.Words FOSS cho .NET chưa công bố gói NuGet – thay vào đó hãy xây dựng thư viện từ nguồn. Sao chép https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git, sau đó biên dịch Aspose.Words.sln trong cấu hình Release với SDK .NET và tham chiếu tới assembly Aspose.Words kết quả từ dự án của bạn. Thư viện nhắm tới .NET Standard 2.0, vì vậy nó chạy trên .NET Framework 4.6.2+ và .NET 6/8/10.
Bước 2: Nhập các lớp cần thiết
Thêm một chỉ thị using Aspose.Words; cho Document và DocumentBuilder, và một chỉ thị using Aspose.Words.Markup; cho StructuredDocumentTag, SdtType, SdtListItem, SdtListItemCollection, XmlMapping, và các lớp điều khiển nội dung khác mà hướng dẫn này đề cập.
Bước 3: Kiểm tra các loại Content-Control bạn có thể chèn
Trước khi chèn, hãy kiểm tra xem mục tiêu SdtType có phải là một trong bảy loại được DocumentBuilder.InsertStructuredDocumentTag(SdtType) chấp nhận không: PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture và Date. RepeatingSection và RepeatingSectionItem không thể được chèn tại con trỏ văn bản bằng phương pháp này – chúng bao bọc toàn bộ đoạn văn hoặc hàng bảng. Các giá trị SdtType còn lại có thể xuất hiện trong tệp Word nhưng không có trong giao diện Word như các loại có thể chèn – None, Bibliography, Citation, Equation, BuildingBlockGallery, DocPartObj, Group và EntityPicker – không được phương pháp chèn này chấp nhận ở mọi trường hợp.
Bước 4: Chèn một Content Control tại con trỏ
Gọi DocumentBuilder.InsertStructuredDocumentTag(SdtType) với một trong bảy loại được hỗ trợ để chèn một control mới tại vị trí con trỏ hiện tại của builder; lời gọi trả về StructuredDocumentTag mới. Đặt Tag và Title trên control đã trả về để cung cấp các chuỗi nhận dạng mà tác giả thấy trong Word, và đặt PlaceholderName (được hỗ trợ bởi một Placeholder BuildingBlock) cho văn bản gợi nhắc mà Word hiển thị khi control trống – IsShowingPlaceholderText báo cáo liệu gợi nhắc đó có đang được hiển thị hay không.
Bước 5: Cấu hình nội dung theo loại
Đối với control checkbox, đọc hoặc đặt StructuredDocumentTag.Checked, và gọi SetCheckedSymbol() / SetUncheckedSymbol() để tùy chỉnh các glyph hiển thị cho mỗi trạng thái. Đối với control ngày, đặt FullDate, với DateDisplayFormat và DateDisplayLocale kiểm soát cách nó hiển thị, DateStorageFormat (SdtDateStorageFormat) kiểm soát cách nó được lưu khi ràng buộc với dữ liệu XML, và CalendarType (SdtCalendarType) chọn hệ thống lịch. Đối với danh sách thả xuống hoặc hộp combo, điền ListItems – một SdtListItemCollection của SdtListItem (DisplayText, Value) – trước khi đặt SelectedValue để chọn lựa chọn đang hoạt động. Đối với control văn bản thuần, Multiline là một thuộc tính bool trên StructuredDocumentTag có thể được đặt để cấu hình control.
Bước 6: Kiểm soát giao diện và khóa
Đặt Appearance (SdtAppearance) để kiểm soát cách control được đánh dấu trực quan trong Word, và Color để đặt màu nổi bật của nó. ContentsFont và EndCharacterFont kiểm soát phông chữ được áp dụng cho nội dung của control và ký tự cuối trailing của nó. LockContentControl và LockContents là các công tắc độc lập – đặt LockContentControl để ngăn việc xóa chính control, và LockContents để ngăn việc chỉnh sửa nội dung bên trong, mà không ảnh hưởng đến cái còn lại.
Bước 7: Tìm và Xóa Điều khiển Nội dung
Đọc Range.StructuredDocumentTags – một StructuredDocumentTagCollection có phạm vi tới đoạn đó – và gọi GetById(), GetByTag(), hoặc GetByTitle() để tìm một điều khiển cụ thể, hoặc Remove() / RemoveAt() trên tập hợp để xóa một điều khiển theo tham chiếu hoặc chỉ mục. Đối với một điều khiển riêng lẻ, gọi Remove() để xóa điều khiển cùng với nội dung của nó, RemoveSelfOnly() để xóa chỉ phần bao bọc trong khi giữ nội dung trong tài liệu, hoặc Clear() để làm trống nội dung trong khi giữ nguyên điều khiển.
Bước 8: Gắn một Điều khiển với Dữ liệu XML Tùy chỉnh
Đọc StructuredDocumentTag.XmlMapping – một thể hiện XmlMapping – và gọi SetMapping(customXmlPart, xPath, prefixMapping) để gắn điều khiển với một phần XML tùy chỉnh đã tồn tại trong kho dữ liệu XML tùy chỉnh của tài liệu, sử dụng biểu thức XPath để chọn phần tử đã gắn. XmlMapping.IsMapped báo cáo liệu một liên kết có đang hoạt động hay không, CustomXmlPart và StoreItemId xác định phần dữ liệu đã gắn, và Delete() loại bỏ ánh xạ.
Bước 9: Xử lý Các Điều khiển Nội dung Phạm vi Nhiều Phần
Một điều khiển nội dung kéo dài qua hơn một phần của tài liệu – được báo cáo bởi IsMultiSection – không được biểu diễn bằng một nút StructuredDocumentTag duy nhất mà bằng một cặp StructuredDocumentTagRangeStart / StructuredDocumentTagRangeEnd, được kết nối qua StructuredDocumentTagRangeStart.RangeEnd. Hãy lập trình dựa trên giao diện chung IStructuredDocumentTag (Tag, Title, Placeholder, PlaceholderName, Appearance, IsShowingPlaceholderText, RemoveSelfOnly()) khi mã cần xử lý đồng nhất cả dạng nút đơn và dạng phạm vi, thay vì phân nhánh dựa trên kiểu cụ thể.
Các Vấn đề Thường gặp và Giải pháp
InsertStructuredDocumentTag ném NotImplementedException Yêu cầu SdtType – ví dụ Citation, Equation, hoặc BuildingBlockGallery – không phải là một trong bảy loại có thể chèn. Sử dụng PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture, hoặc Date thay vào.
InsertStructuredDocumentTag ném InvalidOperationException RepeatingSection or RepeatingSectionItem được yêu cầu tại con trỏ văn bản. Hai loại này bao bọc toàn bộ đoạn văn hoặc hàng bảng thay vì được chèn tại vị trí con trỏ.
Loại bỏ một điều khiển nội dung cũng sẽ xóa văn bản bên trong nó Remove() xóa toàn bộ điều khiển và nội dung của nó. Gọi RemoveSelfOnly() thay vào để giữ nội dung trong tài liệu và chỉ loại bỏ phần bao bọc.
Checkbox không hiển thị ký hiệu mong đợi Các glyph đã chọn và chưa chọn tùy chỉnh chưa bao giờ được đặt. Gọi SetCheckedSymbol() and SetUncheckedSymbol() trên điều khiển.
Danh sách thả xuống hoặc hộp kết hợp không hiển thị bất kỳ lựa chọn nào ListItems không bao giờ được điền dữ liệu. Thêm SdtListItem các mục vào điều khiển’s ListItems tập hợp trước khi mong đợi các lựa chọn xuất hiện, sau đó thiết lập SelectedValue để chọn mục đang hoạt động.
Câu hỏi thường gặp
Tôi có thể chèn trực tiếp các loại content-control nào bằng DocumentBuilder?
PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture, và Date. Các giá trị SdtType khác không được InsertStructuredDocumentTag() hỗ trợ.
Làm sao tôi tìm tất cả các content control có thẻ cụ thể?
Đọc Range.StructuredDocumentTags và gọi GetByTag(), hoặc GetByTitle() / GetById() nếu khớp với các định danh đó thay thế.
Làm sao tôi xóa một content control nhưng giữ lại nội dung của nó trong tài liệu?
Gọi StructuredDocumentTag.RemoveSelfOnly() thay vì Remove().
Làm sao tôi liên kết một content control với dữ liệu XML tùy chỉnh?
Gọi XmlMapping.SetMapping() trên XmlMapping của control, chỉ nó tới một phần XML tùy chỉnh hiện có và một biểu thức XPath bên trong nó.
Content control bao phủ nhiều phần khác với content control thông thường như thế nào?
Nó được biểu diễn dưới dạng cặp StructuredDocumentTagRangeStart / StructuredDocumentTagRangeEnd thay vì một nút StructuredDocumentTag duy nhất; cả hai dạng đều thực thi IStructuredDocumentTag, vì vậy IsMultiSection cho bạn biết dạng nào bạn đang làm việc.