วิธีทำงานกับฟิลด์ใน .NET
คู่มือนี้แสดงวิธีการทำงานกับฟิลด์ของ Word — DATE, IF, REF, DATABASE และหลายสิบรายการอื่น ๆ — ใน Aspose.Words FOSS สำหรับ .NET: การแทรกฟิลด์และอ่านผลลัพธ์ของมัน, การอัปเดตฟิลด์หลังจากการแก้ไขแบบโปรแกรม, การกำหนดพฤติกรรมการอัปเดต, การติดตามการอัปเดตด้วย callback, และการแปลงหรือการลบฟิลด์. Aspose.Words FOSS สำหรับ .NET มีให้ดาวน์โหลดผ่าน NuGet หรือโดยการสร้างจากซอร์สโค้ด.
คู่มือแบบทีละขั้นตอน
ขั้นตอนที่ 1: รับไลบรารี
โคลนรีโพซิทอรีและสร้าง Aspose.Words.sln ในโหมด Release จากนั้นเพิ่มการอ้างอิงโครงการไปยัง Aspose.Words.csproj จากโครงการ .NET ของคุณเอง ตามที่อธิบายไว้ใน คู่มือการติดตั้ง. เพิ่ม using Aspose.Words; and using Aspose.Words.Fields; ที่ส่วนบนของไฟล์ใด ๆ ที่ทำงานกับฟิลด์.
ขั้นตอนที่ 2: แทรกฟิลด์และอ่านผลลัพธ์ของมัน
DocumentBuilder.InsertField() แทรกฟิลด์ใหม่ที่ตำแหน่งเคอร์เซอร์, พร้อมโอเวอร์โหลดที่อัปเดตผลลัพธ์ของฟิลด์ทันทีหรือปล่อยให้การอัปเดตในภายหลัง. ทุกฟิลด์เป็นอินสแตนซ์ของ Field ประกอบด้วยโหนดเครื่องหมายสามตัว — FieldStart, Separator, และ FieldEnd, เปิดเผยเป็น Field.Start / Field.Separator / Field.End. Field.Type ระบุว่า FieldType ใดที่มันแทน, Field.Result และ Field.DisplayResult เก็บค่าที่คำนวณล่าสุด, Field.Format เก็บสวิตช์รูปแบบใด ๆ ที่แนบกับโค้ด, และ Field.GetFieldCode() ส่งคืนข้อความโค้ดฟิลด์ดิบ.
ขั้นตอนที่ 3: ปรับปรุงฟิลด์หลังจากการแก้ไขโดยโปรแกรม
Aspose.Words FOSS ไม่ทำการคำนวณฟิลด์ใหม่เมื่อเอกสารโหลดหรือบันทึก หลังจากการแก้ไขที่ควรทำให้ผลลัพธ์ของฟิลด์เปลี่ยนแปลง ให้เรียก Range.UpdateFields() เพื่อคำนวณฟิลด์ทั้งหมดในช่วงนั้น — ใช้ Document.Range.UpdateFields() สำหรับทั้งเอกสารทั้งหมด — หรือ Field.Update() สำหรับฟิลด์เดี่ยว Range.UnlinkFields() แปลงฟิลด์ทุกตัวในช่วงเป็นข้อความคงที่ในหนึ่งคำเรียก, และ Range.NormalizeFieldTypes() ปรับให้รหัสประเภทที่เก็บของฟิลด์ตรงกับรหัสฟิลด์จริงหลังการแก้ไขด้วยมือ.
ขั้นตอนที่ 4: กำหนดพฤติกรรมการอัปเดตฟิลด์ด้วย FieldOptions
Document.FieldOptions (อินสแตนซ์ของ FieldOptions) ควบคุมว่าฟิลด์ทั้งหมดของเอกสารทำงานอย่างไรระหว่างการอัปเดต: CurrentUser (อินสแตนซ์ของ UserInformation — Name, Initials, Address) ให้ข้อมูลประจำตัวที่ฟิลด์ที่เกี่ยวข้องกับชื่อผู้เขียนและผู้ใช้จะอ่าน, DefaultDocumentAuthor ป้อนผลลัพธ์ที่เกี่ยวข้องกับผู้เขียน, และ LegacyNumberFormat / UseInvariantCultureNumberFormat / PreProcessCulture / FieldUpdateCultureSource ควบคุมการจัดรูปแบบตัวเลขและวันที่. สำหรับ pipeline ที่ทำงานแบบไม่มีผู้ดูแล, กำหนดค่า FieldOptions.UserPromptRespondent (เป็น IFieldUserPromptRespondent) เพื่อให้ฟิลด์ที่ต้องการการตอบสนองเช่น ASK และ FILLIN ไม่บล็อกรอการป้อนข้อมูลแบบโต้ตอบ, และกำหนด IFieldDatabaseProvider แบบกำหนดเองให้กับ FieldOptions.FieldDatabaseProvider เพื่อให้แถวของฟิลด์ DATABASE มาจากแหล่งข้อมูลของคุณเองแทนการเชื่อมต่อฐานข้อมูลจริง.
ขั้นตอนที่ 5: ติดตามการอัปเดตฟิลด์ด้วย Callback
ใช้ IFieldUpdatingCallback (FieldUpdating และ FieldUpdated) และกำหนดให้กับ FieldOptions เพื่อรันโค้ดทันทีก่อนและหลังที่ฟิลด์ทุกตัวทำการคำนวณใหม่ — มีประโยชน์สำหรับการตรวจสอบว่าฟิลด์ใดเปลี่ยนแปลงในงานแบบแบตช์. สำหรับการรายงานความคืบหน้าในเอกสารขนาดใหญ่, ใช้ IFieldUpdatingProgressCallback (Notify) ซึ่งรับ FieldUpdatingProgressArgs ที่เปิดเผย TotalFieldsCount, UpdatedFieldsCount, และ UpdateCompleted.
ขั้นตอนที่ 6: แปลงหรือกำจัดฟิลด์
Field.Unlink() แทนที่ฟิลด์ด้วยผลลัพธ์ที่คำนวณครั้งสุดท้ายเป็นข้อความคงที่ธรรมดา, กำจัดรหัสฟิลด์พื้นฐาน — ใช้เมื่อคุณต้องการให้ค่าถูกฝังในเอกสารอย่างถาวร. Field.Remove() ลบโหนด FieldStart, Separator, และ FieldEnd พร้อมกับรหัสและผลลัพธ์ของฟิลด์, ทำให้ฟิลด์ถูกกำจัดอย่างสมบูรณ์. ควรใช้สองวิธีนี้แทนการลบโหนดมาร์กเกอร์โดยตรง, เนื่องจากการลบส่วนหนึ่งของโครงสร้างฟิลด์ด้วยตนเองอาจทำให้ต้นไม้ของเอกสารไม่สอดคล้อง.
ปัญหาทั่วไปและการแก้ไข
ผลลัพธ์ที่แสดงของฟิลด์จะล้าสมัยหลังจากแก้ไขเอกสาร. Aspose.Words FOSS ไม่ได้ทำการอัปเดตฟิลด์อัตโนมัติเมื่อโหลดหรือบันทึก. Call Range.UpdateFields() or Field.Update() อย่างชัดเจนหลังจากการแก้ไข.
PAGE, NUMPAGES, หรือหมายเลขหน้าสารบัญจะแสดงเสมอ 0. การจัดหน้า/การเรนเดอร์ไม่เป็นส่วนหนึ่งของฉบับนี้ ดังนั้นฟิลด์ที่ผลลัพธ์ขึ้นกับการแบ่งหน้า จะถูกประเมินเป็นตัวแทนชั่วคราว 0. นี่เป็นพฤติกรรมที่คาดหวังในฉบับนี้.
การอัปเดตฟิลด์เป็นชุดดูเหมือนว่าจะค้างอยู่. ฟิลด์ที่ขับเคลื่อนโดยพรอมต์ (ASK, FILLIN) ไม่มี IFieldUserPromptRespondent กำหนดไว้. กำหนด FieldOptions.UserPromptRespondent, หรือกำหนด DefaultResponse บนอินสแตนซ์ฟิลด์แต่ละอัน.
The DATABASE ฟิลด์ไม่สร้างแถวใด. ไม่มี IFieldDatabaseProvider ถูกกำหนดให้กับ FieldOptions.FieldDatabaseProvider. ดำเนินการติดตั้งอินเทอร์เฟซและกำหนดค่าให้ก่อนเรียกใช้ Range.UpdateFields().
คำถามที่พบบ่อย
Aspose.Words FOSS ประเมินทุกประเภทฟิลด์ของ Word หรือไม่?
โมเดลอ็อบเจ็กต์ Field แสดงค่าของ FieldType ทุกค่าและอัปเดตส่วนใหญ่ของมัน แต่ฟิลด์ที่ผลลัพธ์ขึ้นอยู่กับการจัดหน้า — เช่น PAGE และ NUMPAGES — จะประเมินเป็น 0 เนื่องจากรุ่นนี้ไม่ได้รวมเอาเอนจินการจัดหน้า/การเรนเดอร์.
ฉันจะประเมินฟิลด์ใหม่หลังจากการแก้ไขโดยโปรแกรมได้อย่างไร?
เรียก Range.UpdateFields() บนช่วงที่ครอบคลุมเนื้อหาที่แก้ไข หรือ Document.Range.UpdateFields() สำหรับเอกสารทั้งหมด.
ฉันสามารถแปลงฟิลด์เป็นข้อความธรรมดาแบบคงที่ได้หรือไม่?
ได้ — Field.Unlink() จะแทนที่ฟิลด์ด้วยผลลัพธ์ที่คำนวณล่าสุดเป็นข้อความธรรมดา.
ฉันจะลบฟิลด์ออกอย่างสมบูรณ์ รวมถึงผลลัพธ์ของมันได้อย่างไร?
เรียก Field.Remove(). มันจะลบโหนด FieldStart, Separator และ FieldEnd พร้อมกับโค้ดของฟิลด์และเนื้อหาผลลัพธ์.
ฉันจะจัดหาข้อมูลที่กำหนดเองให้กับฟิลด์ DATABASE ได้อย่างไร?
ดำเนินการ IFieldDatabaseProvider และกำหนดให้กับ Document.FieldOptions.FieldDatabaseProvider. การทำงานของ GetQueryResult() จะคืนค่า FieldDatabaseDataTable ที่สร้างจากอินสแตนซ์ของ FieldDatabaseDataRow.