Hur man arbetar med listor i .NET
Hur man arbetar med listor i .NET
Numrerade och punktlistor i ett Word-dokument byggs upp av tre samverkande objekt: List, den återanvändbara numreringsdefinitionen; ListFormat, som talar om för ett specifikt stycke vilken lista och nivå det tillhör; och ListLevel, som innehåller den faktiska formateringen för en nivå. Den här guiden visar hur man tillämpar en lista på ett stycke, hindrar separata listor från att dela en räknare, flyttar stycken mellan nivåer och anpassar nummer- och punktformatering med Aspose.Words FOSS för .NET.
Steg-för-steg-guide
Steg 1: Tillämpa en lista på ett stycke
Använd ListFormat.ApplyBulletDefault() eller ApplyNumberDefault() på ett styckes formatering för att tillämpa Words standardpunkt- eller numreringslista i ett anrop — detta är det snabbaste sättet att applicera en standardlista. För ett specifikt fördefinierat format istället för standarden, anropa Document.Lists (en ListCollection) .Add(listTemplate) med ett ListTemplate värde såsom BulletDisk, BulletSquare, NumberArabicDot eller NumberUppercaseRomanDot för att skapa en List från ett av Words inbyggda format, eller AddSingleLevelList(listTemplate) för en enkelnivåvariant. När ett stycke har listformatering, rapporterar ListFormat.IsListItem true, och ListFormat.List/ListLevelNumber identifierar vilken lista och nivå som används.
Steg 2: Ge en ny grupp av stycken oberoende numrering
Paragrafer vars ListFormat.List pekar på samma delade List-objekt fortsätter samma räknare. När en ny grupp av paragrafer behöver numrering som startar om från 1 oberoende, anropa ListCollection.AddCopy(srcList) för att duplicera en befintlig listdefinition, och tillämpa sedan kopian på de nya paragraferna i stället för att återanvända den ursprungliga. ListCollection.GetListByListId(listId) hämtar en specifik lista via dess ListId när du behöver slå upp en snarare än att skapa en, och Count rapporterar hur många listor dokumentet för närvarande har.
Steg 3: Flytta ett stycke mellan listnivåer
Använd ListFormat.ListIndent() för att flytta ett stycke ett nivå djupare i sin lista, och ListOutdent() för att flytta det en nivå högre upp — samma operationer som Word utför för Tab och Shift+Tab i början av ett liststycke. Föredra dessa metoder framför att sätta ListLevelNumber direkt, eftersom de håller styckets listformatering internt konsistent. Anropa RemoveNumbers() för att helt ta bort listformatering från ett stycke.
Steg 4: Anpassa en listnivås numreringsformat
Kom åt en specifik nivå via List.ListLevels (en ListLevelCollection), sätt sedan ListLevel.NumberStyle (ett NumberStyle-värde såsom Arabic, UppercaseRoman, LowercaseLetter eller Bullet) och NumberFormat — formatsträngen som kombinerar siffran med bokstavlig text såsom en punkt eller parentes — tillsammans, eftersom ett mismatcherat par ger oväntad rendering. StartAt anger nivåns startnummer, och RestartAfterLevel styr vilken högre nivåns ökning som återställer denna nivåns räknare — ange det explicit på nästlade listor istället för att förlita dig på standardbeteendet för återstart. Alignment (Left, Center, Right) och TrailingCharacter (Tab, Space, Nothing) styr etikettposition och separatorn mellan etiketten och stycketexten, tillsammans med TabPosition, NumberPosition och TextPosition för exakt layout. IsLegal tvingar juridisk stilnumrering (alltid arabiska) oavsett NumberStyle.
Steg 5: Lägg till en bildpunkt i en listnivå
Anropa ListLevel.CreatePictureBullet() på mål-nivån för att skapa en bildpunktdefinition, ange sedan bildpunktens ImageData innan du tar bort eventuell befintlig textpunktformatering på samma nivå. Anropa DeletePictureBullet() för att ta bort en bildpunkt och återgå till textbaserad punktformatering.
Steg 6: Inspektera listpostens renderade etikett
ListLabel beskriver den etikett som faktiskt renderas för ett listobjekt, hämtad från objektets styckeformatering. LabelString är den bokstavliga text som Word visar — t.ex. “3.” eller “•” — LabelValue är det underliggande numeriska värdet, och Font är etikettens egna formatering, oberoende av styckeformatet. För att beräkna en etikettens värde på en godtycklig position i sekvensen utan att rendera hela listan, anropa ListLevel.GetEffectiveValue(index, numberStyle, customNumberStyleFormat).
Vanliga problem och lösningar
Två stycken som bör numreras oberoende fortsätter samma sekvens. Båda styckens ListFormat.List refererar till samma delade List objekt. Ge den andra gruppen sin egen lista via ListCollection.AddCopy(srcList) istället för att återanvända samma List.
En anpassad numreringsformatsträng renderas inte som förväntat. ListLevel.NumberFormat matchar inte det förväntade mönstret för nivåns NumberStyle. Verifiera NumberFormat and NumberStyle är inställda konsekvent för nivån som redigeras.
Listindragningen ser felaktig ut efter att nivåerna har ändrats programatiskt. ListLevelNumber ställdes in direkt utan att uppdatera relaterade positionsegenskaper. Använd ListFormat.ListIndent()/ListOutdent() istället för att sätta ListLevelNumber direkt.
En bildpunkt visas inte på en nivå. Ingen bildpunkt skapades för den nivån, eller så är standardformatering för textpunkter fortfarande aktiv. Anropa ListLevel.CreatePictureBullet() och leverera bilddata innan du tar bort formateringen för textpunkter.
En stilkopplad lista svarar inte på direkta formateringsändringar. Check List.IsListStyleReference — en stilrefererande listas formatering styrs av dess länkade Style (via List.Style), inte genom att redigera listan direkt. Jämför med IsListStyleDefinition för att särskilja en lista som definierar sin egen formatering.
Vanliga frågor
Vad är skillnaden mellan List och ListFormat?
List är den återanvändbara numrerings- eller punktdefinitionen som delas över stycken. ListFormat är per stycke — den pekar på vilket List ett specifikt stycke använder och på vilken nivå, via ListFormat.List och ListLevelNumber.
Hur kontrollerar jag om ett stycke redan är en del av en lista?
Läs ListFormat.IsListItem om styckets formatering. Om true, ListFormat.List och ListLevelNumber identifierar vilken lista och nivå det tillhör.
Hur får jag en ny lista att börja numrera från 1 oberoende av en befintlig lista?
Använd ListCollection.AddCopy(srcList) för att skapa en oberoende kopia av listdefinitionen, och applicera sedan kopian på de nya styckena istället för att återanvända den ursprungliga List, vilket skulle fortsätta samma räknare.
Hur skapar jag en punkt- eller numrerad lista från grunden?
Använd ListFormat.ApplyBulletDefault() eller ApplyNumberDefault() för Word’s standardformatering, eller ListCollection.Add(listTemplate) med ett ListTemplate-värde för att börja från ett fördefinierat format och anpassa den resulterande List.ListLevels därifrån.
Hur får jag ett talformat som “1)” istället för “1.”?
Ställ in ListLevel.NumberFormat på den relevanta nivån till önskad formatsträng, tillsammans med NumberStyle för själva siffrastilen.