كيفية العمل مع القوائم في .NET
كيفية العمل مع القوائم في .NET
القوائم المرقمة والقوائم النقطية في مستند Word تُبنى من ثلاثة كائنات متعاونة: List، تعريف الترقيم القابل لإعادة الاستخدام؛ ListFormat، الذي يحدد للفقرة المحددة أي قائمة وأي مستوى تنتمي إليه؛ وListLevel، الذي يحتوي على التنسيق الفعلي لمستوى واحد. يوضح هذا الدليل كيفية تطبيق قائمة على فقرة، ومنع القوائم المنفصلة من مشاركة عداد، ونقل الفقرات بين المستويات، وتخصيص تنسيق الترقيم والنقطة باستخدام Aspose.Words FOSS لـ .NET.
دليل خطوة بخطوة
الخطوة 1: تطبيق قائمة على فقرة
استخدم ListFormat.ApplyBulletDefault() أو ApplyNumberDefault() على تنسيق الفقرة لتطبيق القائمة النقطية أو المرقمة الافتراضية في Word بنقرة واحدة — هذه أسرع طريقة لتطبيق قائمة قياسية. للحصول على تنسيق محدد مسبقًا بدلاً من الافتراضي، استدعِ Document.Lists (ListCollection) .Add(listTemplate) مع قيمة ListTemplate مثل BulletDisk، BulletSquare، NumberArabicDot أو NumberUppercaseRomanDot لإنشاء List من أحد تنسيقات Word المدمجة، أو AddSingleLevelList(listTemplate) لنسخة ذات مستوى واحد. بمجرد أن تكون للفقرة تنسيق قائمة، يقوم ListFormat.IsListItem بالإبلاغ عن true، وListFormat.List/ListLevelNumber يحددان أي قائمة وأي مستوى يستخدمها.
الخطوة 2: إعطاء مجموعة جديدة من الفقرات ترقيمًا مستقلاً
الفقرات التي ListFormat.List الخاص بها يشير إلى نفس كائن List المشترك تستمر في نفس العداد. عندما تحتاج مجموعة جديدة من الفقرات إلى ترقيم يبدأ من 1 بشكل مستقل، استدعِ ListCollection.AddCopy(srcList) لنسخ تعريف قائمة موجود، ثم طبّق النسخة على الفقرات الجديدة بدلاً من إعادة استخدام الأصل. ListCollection.GetListByListId(listId) يسترجع قائمة محددة بواسطة ListId عندما تحتاج إلى البحث عنها بدلاً من إنشاء واحدة، وCount يُبلغ عن عدد القوائم التي يحتويها المستند حالياً.
الخطوة 3: نقل فقرة بين مستويات القائمة
استخدم ListFormat.ListIndent() لنقل فقرة مستوىً واحدًا أعمق في القائمة، وListOutdent() لنقلها مستوىً واحدًا أقل — نفس العمليات التي يقوم بها Word عند الضغط على Tab وShift+Tab في بداية فقرة القائمة. يفضَّل استخدام هذه الأساليب بدلاً من ضبط ListLevelNumber مباشرةً، لأنها تحافظ على تنسيق القائمة للفقرة متسقًا داخليًا. استدعِ RemoveNumbers() لإزالة تنسيق القائمة من الفقرة بالكامل.
الخطوة 4: تخصيص تنسيق ترقيم مستوى القائمة
الوصول إلى مستوى محدد عبر List.ListLevels (وهو ListLevelCollection)، ثم ضبط ListLevel.NumberStyle (قيمة NumberStyle مثل Arabic، UppercaseRoman، LowercaseLetter أو Bullet) وNumberFormat — سلسلة التنسيق التي تجمع الرقم مع نص حرفي مثل نقطة أو قوسين — معًا، لأن الزوج غير المتطابق ينتج عرضًا غير متوقع. StartAt يحدد رقم البداية للمستوى، وRestartAfterLevel يتحكم في أي مستوى أعلى يُعيد عدّ هذا المستوى — اضبطه صراحةً في القوائم المتداخلة بدلاً من الاعتماد على سلوك إعادة التشغيل الافتراضي. Alignment (Left، Center، Right) وTrailingCharacter (Tab، Space، Nothing) يتحكمان في موضع التسمية والفاصل بين التسمية ونص الفقرة، إلى جانب TabPosition، NumberPosition، وTextPosition لتخطيط دقيق. IsLegal يفرض ترقيمًا بنمط قانوني (دائمًا عربي) بغض النظر عن NumberStyle.
الخطوة 5: إضافة نقطة صورة إلى مستوى القائمة
استدعِ ListLevel.CreatePictureBullet() على المستوى المستهدف لإنشاء تعريف نقطة صورة، ثم قدم ImageData للنقطة قبل إزالة أي تنسيق نقطة نصية موجود على نفس المستوى. استدعِ DeletePictureBullet() لإزالة نقطة الصورة والعودة إلى تنسيق نقطة نصية.
الخطوة 6: فحص التسمية المعروضة لعنصر القائمة
ListLabel يصف التسمية التي تُعرض فعليًا لعنصر قائمة واحد، يتم الوصول إليها من تنسيق الفقرة للعنصر. LabelString هو النص الحرفي الذي يعرضه Word — مثل “3.” أو “•” — LabelValue هو القيمة الرقمية الأساسية، وFont هو تنسيق التسمية نفسه، مستقلاً عن تنسيق نص الفقرة. لحساب قيمة التسمية في موضع عشوائي في التسلسل دون عرض القائمة كاملة، استدعِ ListLevel.GetEffectiveValue(index, numberStyle, customNumberStyleFormat).
المشكلات الشائعة والحلول
فقرتان يجب أن تُرقمان بشكل مستقل تستمران في نفس التسلسل. كلا الفقرتين’ ListFormat.List تشير إلى نفس المشترك List كائن. أعطِ المجموعة الثانية قائمتها الخاصة عبر ListCollection.AddCopy(srcList) بدلاً من إعادة استخدام نفس List.
سلسلة تنسيق الترقيم المخصصة لا تُظهر النتيجة المتوقعة. ListLevel.NumberFormat لا تتطابق مع النمط المتوقع للمستوى NumberStyle. تحقق NumberFormat and NumberStyle يتم ضبطها بشكل ثابت للمستوى الذي يتم تحريره.
يظهر إزاحة القائمة بشكل غير صحيح بعد تغيير المستويات برمجيًا. ListLevelNumber تم تعيينه مباشرةً دون تحديث خصائص الموقع المرتبطة. استخدم ListFormat.ListIndent()/ListOutdent() بدلاً من تعيين ListLevelNumber مباشرةً.
لا يظهر رمز نقطي صورة على مستوى. لم يتم إنشاء رمز نقطي صورة لهذا المستوى، أو لا يزال تنسيق النص النقطي الافتراضي نشطًا. استدعِ ListLevel.CreatePictureBullet() وامدّ بيانات الصورة قبل إزالة تنسيق النص النقطي.
القاائمة المرتبطة بالنمط لا تستجيب لتغييرات التنسيق المباشرة. Check List.IsListStyleReference — تنسيق قائمة الإشارة إلى النمط يتحكم فيه النمط المرتبط بها Style (عبر List.Style) ليست عن طريق تعديل القائمة مباشرة. قارن مع IsListStyleDefinition للتفريق بين قائمة تُعرّف تنسيقها الخاص.
الأسئلة المتكررة
ما الفرق بين List وListFormat؟
List هو تعريف الترقيم أو القوائم النقطية القابل لإعادة الاستخدام المشترك عبر الفقرات. ListFormat هو لكل فقرة — فهو يشير إلى أي List تستخدمه الفقرة المحددة وإلى أي مستوى، عبر ListFormat.List وListLevelNumber.
كيف أتحقق مما إذا كانت الفقرة جزءًا من قائمة بالفعل؟
اقرأ ListFormat.IsListItem حول تنسيق الفقرة. إذا كان true، فإن ListFormat.List وListLevelNumber يحددان القائمة والمستوى الذي تنتمي إليه.
كيف أجعل قائمة جديدة تبدأ الترقيم من 1 بشكل مستقل عن قائمة موجودة؟
استخدم ListCollection.AddCopy(srcList) لإنشاء نسخة مستقلة من تعريف القائمة، ثم طبّق النسخة على الفقرات الجديدة بدلاً من إعادة استخدام List الأصلي، الذي سيستمر في نفس العداد.
كيف أنشئ قائمة نقطية أو مرقمة من الصفر؟
استخدم ListFormat.ApplyBulletDefault() أو ApplyNumberDefault() لتنسيق Word الافتراضي، أو ListCollection.Add(listTemplate) بقيمة ListTemplate للبدء من تنسيق محدد مسبقًا وتخصيص List.ListLevels الناتج من هناك.
كيف أحصل على تنسيق رقم مثل “1)” بدلاً من “1."؟
عيّن ListLevel.NumberFormat على المستوى المناسب إلى سلسلة التنسيق المطلوبة، إلى جانب NumberStyle لنمط الأرقام نفسه.