Hur man arbetar med fält i .NET

Hur man arbetar med fält i .NET

Den här guiden visar hur man arbetar med Word-fält — DATE, IF, REF, DATABASE och dussintals andra — i Aspose.Words FOSS för .NET: att infoga ett fält och läsa dess resultat, uppdatera fält efter en programmatisk redigering, konfigurera uppdateringsbeteende, spåra uppdateringar med en återuppringning och konvertera eller ta bort ett fält. Aspose.Words FOSS för .NET finns tillgängligt via NuGet eller genom att bygga från källkod.

Steg-för-steg-guide

Steg 1: Hämta biblioteket

Klona förrådet och bygg Aspose.Words.sln i Release-konfiguration, lägg sedan till en projektreferens till Aspose.Words.csproj från ditt eget .NET-projekt, enligt beskrivningen i Installationsguiden. Lägg till using Aspose.Words; and using Aspose.Words.Fields; överst i alla filer som arbetar med fält.


Steg 2: Infoga ett fält och läs dess resultat

DocumentBuilder.InsertField() infogar ett nytt fält vid markören, med överlagringar som antingen uppdaterar fältets resultat omedelbart eller lämnar det för en senare uppdateringspass. Varje fält är en Field-instans bestående av tre markörnoder — FieldStart, Separator och FieldEnd, exponerade som Field.Start / Field.Separator / Field.End. Field.Type identifierar vilket FieldType det representerar, Field.Result och Field.DisplayResult innehåller det senast beräknade värdet, Field.Format innehåller eventuella formatväxlar som är kopplade till koden, och Field.GetFieldCode() returnerar den råa fältkodstexten.


Steg 3: Uppdatera fält efter en programmatisk redigering

Aspose.Words FOSS räknar inte om fält när dokumentet laddas eller sparas. Efter en redigering som bör ändra ett fälts resultat, anropa Range.UpdateFields() för att räkna om alla fält i det intervallet — använd Document.Range.UpdateFields() för hela dokumentet — eller Field.Update() för ett enskilt fält. Range.UnlinkFields() konverterar alla fält i intervallet till statisk text i ett anrop, och Range.NormalizeFieldTypes() stämmer av ett fälts lagrade typkod mot dess faktiska fältkod efter en manuell redigering.


Steg 4: Konfigurera fältuppdateringsbeteende med FieldOptions

Document.FieldOptions (en FieldOptions-instans) styr hur hela dokumentets fält beter sig under en uppdatering: CurrentUser (en UserInformation-instans — Name, Initials, Address) tillhandahåller den identitet som författar- och användarnamnrelaterade fält läser från, DefaultDocumentAuthor sår författarrelaterade resultat, och LegacyNumberFormat / UseInvariantCultureNumberFormat / PreProcessCulture / FieldUpdateCultureSource styr nummer- och datumformat. För oövervakade pipelines, tilldela FieldOptions.UserPromptRespondent (en IFieldUserPromptRespondent) så att promptstyrda fält som ASK och FILLIN inte blockerar genom att vänta på interaktiv inmatning, och tilldela en anpassad IFieldDatabaseProvider till FieldOptions.FieldDatabaseProvider för att leverera DATABASE-fältets rader från din egen datakälla istället för en riktig databasanslutning.


Steg 5: Spåra fältuppdateringar med en återuppringning

Implementera IFieldUpdatingCallback (FieldUpdating och FieldUpdated) och tilldela den till FieldOptions för att köra kod omedelbart före och efter att varje fält räknas om — användbart för att auditera exakt vilka fält som ändrades i ett batchjobb. För rapportering av framsteg i ett stort dokument, implementera IFieldUpdatingProgressCallback (Notify), som tar emot en FieldUpdatingProgressArgs som exponerar TotalFieldsCount, UpdatedFieldsCount och UpdateCompleted.


Steg 6: Konvertera eller ta bort ett fält

Field.Unlink() ersätter fältet med dess senast beräknade resultat som vanlig statisk text, och kastar bort den underliggande fältkoden — använd den när du vill ha värdet permanent inbakat i dokumentet. Field.Remove() tar bort FieldStart, Separator och FieldEnd-noderna tillsammans med fältets kod och resultat, vilket tar bort fältet helt. Föredra dessa två metoder framför att direkt radera markörnoderna, eftersom manuell borttagning av endast en del av ett fälts struktur kan lämna dokumentträdet inkonsekvent.

Vanliga problem och lösningar

Ett fälts visade resultat blir föråldrat efter att dokumentet redigerats. Aspose.Words FOSS uppdaterar inte automatiskt fält vid inläsning eller sparning. Anropa Range.UpdateFields() or Field.Update() explicit efter redigeringen.

PAGE, NUMPAGES, eller ett innehållsförteckningssidnummer visas alltid 0. Sidlayout/rendering är inte en del av den här utgåvan, så fält vars resultat beror på paginering utvärderas till en platshållare 0. Detta är förväntat beteende i den här utgåvan.

En batchfältuppdatering verkar hänga. Ett promptdrivet fält (ASK, FILLIN) har ingen IFieldUserPromptRespondent tilldelad. Tilldela FieldOptions.UserPromptRespondent, eller sätt DefaultResponse på den individuella fältinstansen.

Den DATABASE fältet producerar inga rader. Ingen IFieldDatabaseProvider är tilldelad till FieldOptions.FieldDatabaseProvider. Implementera gränssnittet och tilldela det innan du anropar Range.UpdateFields().

Vanliga frågor

Utvärderar Aspose.Words FOSS varje Word-fälttyp?

Objektmodellen Field representerar varje FieldType värde och uppdaterar de flesta av dem, men fält vars resultat beror på sidlayout — såsom PAGE och NUMPAGES — utvärderas till en platshållar 0 eftersom den här utgåvan inte inkluderar layout/renderingsmotorn.

Hur kan jag omvärdera fält efter en programmatisk redigering?

Anropa Range.UpdateFields() på det område som täcker det redigerade innehållet, eller Document.Range.UpdateFields() för hela dokumentet.

Kan jag konvertera ett fält till vanlig, statisk text?

Ja — Field.Unlink() ersätter fältet med dess senast beräknade resultat som vanlig text.

Hur tar jag bort ett fält helt, inklusive dess resultat?

Anropa Field.Remove(). Det raderar FieldStart, Separator och FieldEnd noderna tillsammans med fältets kod och resultatinnehåll.

Hur förser jag anpassad data till DATABASE fältet?

Implementera IFieldDatabaseProvider och tilldela den till Document.FieldOptions.FieldDatabaseProvider. Dess GetQueryResult() implementation returnerar en FieldDatabaseDataTable byggd från FieldDatabaseDataRow instanser.

Se även

 Svenska