วิธีทำงานกับฟิลด์ใน .NET

วิธีทำงานกับฟิลด์ใน .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.

ดูเพิ่มเติม

 ภาษาไทย