Jak pracovat s poli v .NET

Jak pracovat s poli v .NET

Tento průvodce ukazuje, jak pracovat s poli Word — DATE, IF, REF, DATABASE a desítkami dalších — v Aspose.Words FOSS pro .NET: vkládání pole a čtení jeho výsledku, aktualizaci polí po programové úpravě, konfiguraci chování aktualizace, sledování aktualizací pomocí zpětného volání a konverzi nebo odstranění pole. Aspose.Words FOSS pro .NET je k dispozici přes NuGet nebo sestavením ze zdrojového kódu.

Postupný návod

Krok 1: Získání knihovny

Naklonujte repozitář a sestavte Aspose.Words.sln v konfiguraci Release, poté přidejte odkaz na projekt do Aspose.Words.csproj z vašeho vlastního projektu .NET, jak je popsáno v průvodci instalací. Přidejte using Aspose.Words; and using Aspose.Words.Fields; na začátek libovolného souboru, který pracuje s poli.


Krok 2: Vložení pole a přečtení jeho výsledku

DocumentBuilder.InsertField() vloží nové pole na pozici kurzoru, s přetíženými metodami, které buď okamžitě aktualizují výsledek pole, nebo jej nechají na pozdější průchod aktualizací. Každé pole je instance Field složená ze tří značkovacích uzlů — FieldStart, Separator a FieldEnd, vystavených jako Field.Start / Field.Separator / Field.End. Field.Type určuje, který FieldType představuje, Field.Result a Field.DisplayResult uchovávají naposledy vypočítanou hodnotu, Field.Format obsahuje jakékoli formátovací přepínače připojené ke kódu a Field.GetFieldCode() vrací surový text kódu pole.


Krok 3: Aktualizovat pole po programové úpravě

Aspose.Words FOSS nepřepočítává pole při načtení nebo uložení dokumentu. Po úpravě, která by měla změnit výsledek pole, zavolejte Range.UpdateFields(), aby se přepočítala všechna pole v tomto rozsahu — použijte Document.Range.UpdateFields() pro celý dokument — nebo Field.Update() pro jedno pole. Range.UnlinkFields() převede všechna pole v rozsahu na statický text jedním voláním a Range.NormalizeFieldTypes() sladí uložený typový kód pole s jeho skutečným kódem pole po ruční úpravě.


Krok 4: Nakonfigurovat chování aktualizace polí pomocí FieldOptions

Document.FieldOptions (instance FieldOptions) určuje, jak se pole v celém dokumentu chovají během aktualizace: CurrentUser (instance UserInformation — Name, Initials, Address) poskytuje identitu, ze které čtou pole související s autorem a uživatelským jménem, DefaultDocumentAuthor nasazuje výsledky související s autorem a LegacyNumberFormat / UseInvariantCultureNumberFormat / PreProcessCulture / FieldUpdateCultureSource řídí formátování čísel a dat. Pro neobsluhované pipeline přiřaďte FieldOptions.UserPromptRespondent (typ IFieldUserPromptRespondent), aby pole vyžadující výzvu, jako ASK a FILLIN, neblokovala čekáním na interaktivní vstup, a přiřaďte vlastní IFieldDatabaseProvider k FieldOptions.FieldDatabaseProvider, aby poskytoval řádky pole DATABASE z vašeho vlastního zdroje dat místo skutečného připojení k databázi.


Krok 5: Sledovat aktualizace polí pomocí zpětného volání

Implementujte IFieldUpdatingCallback (FieldUpdating a FieldUpdated) a přiřaďte jej k FieldOptions, aby spouštěl kód okamžitě před a po každém přepočítání pole — užitečné pro auditování přesně toho, která pole se změnila v dávkovém úkolu. Pro hlášení postupu v rozsáhlém dokumentu implementujte IFieldUpdatingProgressCallback (Notify), který přijímá FieldUpdatingProgressArgs odhalující TotalFieldsCount, UpdatedFieldsCount a UpdateCompleted.


Krok 6: Převést nebo odstranit pole

Field.Unlink() nahradí pole jeho naposledy vypočteným výsledkem jako obyčejný statický text, zahodí podkladový kód pole — použijte jej, když chcete, aby hodnota byla trvale zakotvena v dokumentu. Field.Remove() smaže uzly FieldStart, Separator a FieldEnd spolu s kódem a výsledkem pole, čímž pole zcela odstraní. Upřednostněte tyto dvě metody před přímým mazáním uzlů značek, protože ruční odstranění jen části struktury pole může zanechat strom dokumentu nekonzistentní.

Časté problémy a opravy

Zobrazený výsledek pole je po úpravě dokumentu zastaralý. Aspose.Words FOSS neaktualizuje pole automaticky při načtení nebo uložení. Zavolejte Range.UpdateFields() or Field.Update() explicitně po úpravě.

PAGE, NUMPAGES, nebo číslo stránky v obsahu se vždy zobrazuje 0. Rozvržení stránky/renderování není součástí této edice, takže pole, jejichž výsledek závisí na stránkování, se vyhodnocují jako zástupný znak 0. Toto je očekávané chování v této edici.

Hromadná aktualizace pole se zdá být zaseknutá. Pole řízené výzvou (ASK, FILLIN) nemá IFieldUserPromptRespondent přiřazený. Přiřaďte FieldOptions.UserPromptRespondent, nebo nastavit DefaultResponse na konkrétní instanci pole.

Tento DATABASE pole nevrací žádné řádky. Ne IFieldDatabaseProvider je přiřazeno k FieldOptions.FieldDatabaseProvider. Implementujte rozhraní a přiřaďte jej před voláním Range.UpdateFields().

Často kladené otázky

Vyhodnocuje Aspose.Words FOSS každý typ pole Word?

Model objektu Field představuje každou hodnotu FieldType a aktualizuje většinu z nich, ale pole, jejichž výsledek závisí na rozvržení stránky — jako jsou PAGE a NUMPAGES — vyhodnocují se jako zástupný 0, protože tato edice neobsahuje engine pro rozvržení/renderování.

Jak mohu znovu vyhodnotit pole po programové úpravě?

Zavolejte Range.UpdateFields() na rozsah, který zahrnuje upravený obsah, nebo Document.Range.UpdateFields() pro celý dokument.

Mohu převést pole na prostý, statický text?

Ano — Field.Unlink() nahradí pole jeho naposledy vypočítaným výsledkem jako obyčejný text.

Jak mohu pole zcela odstranit, včetně jeho výsledku?

Zavolejte Field.Remove(). Odstraní uzly FieldStart, Separator a FieldEnd spolu s kódem pole a obsahem výsledku.

Jak mohu poskytnout vlastní data poli DATABASE?

Implementujte IFieldDatabaseProvider a přiřaďte jej k Document.FieldOptions.FieldDatabaseProvider. Jeho implementace GetQueryResult() vrací FieldDatabaseDataTable postavený z FieldDatabaseDataRow instancí.

Viz také:

 Čeština