Hogyan dolgozzunk a mezőkkel a .NET-ban
Ez az útmutató bemutatja, hogyan dolgozzunk a Word mezőkkel — DATE, IF, REF, DATABASE és még tucatnyi más — a Aspose.Words FOSS-ban a .NET számára: mező beszúrása és eredményének kiolvasása, mezők frissítése programozott szerkesztés után, a frissítési viselkedés konfigurálása, frissítések nyomon követése visszahívással, valamint egy mező átalakítása vagy eltávolítása. A Aspose.Words FOSS a .NET számára elérhető a NuGet útján vagy forráskódból építve.
Lépésről lépésre útmutató
Lépés 1: Szerezd meg a könyvtárat
Klónozza a tárolót és építse Aspose.Words.sln Release konfigurációban, majd adjon hozzá egy projektreferenciát a Aspose.Words.csproj a saját .NET projektjéből, ahogyan a Telepítési útmutató. Adjon hozzá using Aspose.Words; and using Aspose.Words.Fields; a mezőkkel dolgozó bármely fájl tetejére.
Lépés 2: Szúrj be egy mezőt és olvasd ki az eredményét
DocumentBuilder.InsertField() új mezőt szúr be a kurzor helyére, olyan felülterhelésekkel, amelyek vagy azonnal frissítik a mező eredményét, vagy későbbi frissítési lépésre hagyják. Minden mező egy Field példány, amely három jelző csomópontból áll — FieldStart, Separator és FieldEnd, és Field.Start / Field.Separator / Field.End formájában érhető el. Field.Type azonosítja, hogy melyik FieldType képviseli, Field.Result és Field.DisplayResult tárolja az utoljára kiszámított értéket, Field.Format a kódhoz csatolt formázási kapcsolókat tartalmazza, és Field.GetFieldCode() visszaadja a nyers mezőkód szöveget.
3. lépés: Mezők frissítése programozott szerkesztés után
Aspose.Words FOSS nem számolja újra a mezőket, amikor a dokumentum betöltődik vagy mentődik. Egy olyan szerkesztés után, amelynek meg kell változtatnia egy mező eredményét, hívja a Range.UpdateFields() függvényt, hogy újraszámolja az adott tartomány összes mezőjét — használja a Document.Range.UpdateFields() függvényt a teljes dokumentumra — vagy a Field.Update() egyetlen mezőre. A Range.UnlinkFields() egy hívással minden mezőt a tartományban statikus szöveggé alakít, és a Range.NormalizeFieldTypes() a mező tárolt típuskódját összeveti a tényleges mezőkóddal egy manuális szerkesztés után.
4. lépés: Mezőfrissítési viselkedés beállítása a(z) FieldOptions segítségével
Document.FieldOptions (egy FieldOptions példány) szabályozza, hogy a teljes dokumentum mezői hogyan viselkednek egy frissítés során: CurrentUser (egy UserInformation példány — Name, Initials, Address) biztosítja azt az azonosítót, amelyből a szerző- és felhasználónévhez kapcsolódó mezők olvasnak, DefaultDocumentAuthor beülteti a szerzőhöz kapcsolódó eredményeket, és a LegacyNumberFormat / UseInvariantCultureNumberFormat / PreProcessCulture / FieldUpdateCultureSource szabályozzák a szám- és dátumformázást. Felügyelet nélküli folyamatokhoz rendelje hozzá a FieldOptions.UserPromptRespondent (egy IFieldUserPromptRespondent) elemet, hogy a ASK és FILLINhez hasonló prompt-vezérelt mezők ne blokkolják a futást interaktív bemenet várásával, és rendelje hozzá egy egyedi IFieldDatabaseProvider elemet a FieldOptions.FieldDatabaseProviderhez, hogy a DATABASE mező sorait a saját adatforrásából szolgáltassa egy valódi adatbázis-kapcsolat helyett.
5. lépés: Mezőfrissítések nyomon követése egy visszahívással
Valósítsa meg a IFieldUpdatingCallback (FieldUpdating és FieldUpdated) és rendelje hozzá a FieldOptions elemhez, hogy a kódot minden mező újraszámolása előtt és után azonnal futtassa — hasznos annak auditálásához, hogy pontosan mely mezők változtak egy kötegelt feladatban. Nagy dokumentum esetén a haladásjelentéshez valósítsa meg a IFieldUpdatingProgressCallback (Notify) elemet, amely egy FieldUpdatingProgressArgs objektumot kap, amely bemutatja a TotalFieldsCount, UpdatedFieldsCount és UpdateCompleted értékeket.
6. lépés: Mező átalakítása vagy eltávolítása
Field.Unlink() a mezőt az utolsó számított eredményével helyettesíti, mint egyszerű statikus szöveg, eldobva a háttérben lévő mezőkódot — használja, ha a értéket véglegesen a dokumentumba szeretné beágyazni. Field.Remove() törli a FieldStart, Separator és FieldEnd csomópontokat a mezőkóddal és eredménnyel együtt, így a mező teljesen eltűnik. Inkább ezeket a két módszert válassza a marker csomópontok közvetlen törlésével szemben, mivel a mező szerkezetének csak egy részének kézi eltávolítása inkonzisztens dokumentumfát eredményezhet.
Gyakori problémák és megoldások
A mező megjelenített eredménye elavult a dokumentum szerkesztése után. Aspose.Words FOSS nem frissíti automatikusan a mezőket betöltéskor vagy mentéskor. Hívja Range.UpdateFields() or Field.Update() explicit módon a szerkesztés után.
PAGE, NUMPAGES, vagy egy tartalomjegyzék oldalszám mindig megjelenik 0. Az oldalelrendezés/megjelenítés nem része ennek a kiadásnak, ezért a lapozásra támaszkodó mezők helyőrzőként értékelődnek 0. Ez a várt viselkedés ebben a kiadásban.
Úgy tűnik, hogy egy kötegelt mezőfrissítés lefagy. Egy prompt-vezérelt mező (ASK, FILLIN) nincs IFieldUserPromptRespondent hozzárendelve. Hozzárendel FieldOptions.UserPromptRespondent, vagy állítsd be DefaultResponse az egyedi mezőpéldányon.
A DATABASE mező nem ad sorokat. Nincs IFieldDatabaseProvider van hozzárendelve FieldOptions.FieldDatabaseProvider. Implementáld a felületet és rendeld hozzá a hívás előtt Range.UpdateFields().
Gyakran Ismételt Kérdések
A Aspose.Words FOSS minden Word mezőtípust kiértékel?
A Field objektummodell minden FieldType értéket ábrázol és a legtöbbet frissíti, de azok a mezők, amelyek eredménye az oldalelrendezéstől függ — például PAGE és NUMPAGES — egy helyőrző 0 értékre értékelődnek, mivel ez a kiadás nem tartalmazza az elrendezés/megjelenítő motorját.
Hogyan értékelhetem újra a mezőket egy programozott módosítás után?
Hívja meg a Range.UpdateFields() függvényt az a tartományra, amely a szerkesztett tartalmat lefedi, vagy használja a Document.Range.UpdateFields() függvényt a teljes dokumentumra.
Átalakíthatom a mezőt egyszerű, statikus szöveggé?
Igen — a Field.Unlink() a mezőt az utolsó kiszámított eredménnyel helyettesíti, mint egyszerű szöveget.
Hogyan távolíthatok el egy mezőt teljesen, beleértve az eredményét is?
Hívja meg a Field.Remove() függvényt. Ez törli a FieldStart, Separator és FieldEnd csomópontokat a mező kódjával és eredmény tartalmával együtt.
Hogyan adhatok meg egyéni adatot a DATABASE mezőnek?
Implementáld a IFieldDatabaseProvider-t és rendeld hozzá a Document.FieldOptions.FieldDatabaseProvider-hez. A GetQueryResult() implementációja egy FieldDatabaseDataTable-t ad vissza, amely FieldDatabaseDataRow példányokból épül fel.