ما هي الطريقة الصحيحة لاختيار عناصر القائمة ديناميكيًا لقائمة السياق في WinForms؟

StackOverflow https://stackoverflow.com/questions/103514

  •  01-07-2019
  •  | 
  •  

سؤال

أحاول إنشاء قائمة سياق لعنصر تحكم "مرتبط" بعنصر القائمة الرئيسية.يوجد عنصران في القائمة الثابتة موجودان دائمًا وعدد عشوائي من عناصر القائمة الإضافية التي قد يلزم وجودها في القائمة.

لقد حاولت حل المشكلة عن طريق الاحتفاظ بمرجع على مستوى الفصل لعناصر القائمة الثابتة وقائمة بعناصر القائمة الديناميكية.أنا أتعامل مع كلا القائمتين Opening الأحداث عن طريق مسح قائمة العناصر الحالية، ثم إضافة العناصر المناسبة إلى القائمة.يعمل هذا بشكل جيد مع القائمة الرئيسية، لكن قائمة السياق تعمل بشكل غريب.

يبدو أن المشكلة الرئيسية تكمن في ذلك الوقت Opening تم رفع القائمة، وبذلك تكون القائمة قد قررت بالفعل العناصر التي ستعرضها.يوضح هذا النموذج:

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class DemoForm : Form
    {
        private List _items;

        public DemoForm()
        {
            var contextMenu = new ContextMenuStrip();
            contextMenu.Opening += contextMenu_Opening;

            _items = new List();
            _items.Add(new ToolStripMenuItem("item 1"));
            _items.Add(new ToolStripMenuItem("item 2"));


            this.ContextMenuStrip = contextMenu;
        }

        void contextMenu_Opening(object sender, CancelEventArgs e)
        {
            var menu = sender as ContextMenuStrip;

            if (menu != null)
            {
                foreach (var item in _items)
                {
                    menu.Items.Add(item);
                }
            }
        }
    }
}

عند النقر بزر الماوس الأيمن فوق النموذج في المرة الأولى، لا يتم عرض أي شيء.وفي المرة الثانية، يتم عرض القائمة كما هو متوقع.هل هناك حدث آخر تم رفعه حيث يمكنني تحديث العناصر؟هل يعد اختيار عناصر القائمة ديناميكيًا ممارسة سيئة؟

(ملحوظة:هذا مثال بدأت في إعداده لشخص يريد مثل هذه الوظيفة وكان لدي فضول بشأن مدى صعوبة ذلك، لذلك لا يمكنني تقديم تفاصيل حول سبب القيام بذلك.يريد هذا الشخص "ربط" عنصر القائمة الرئيسية بقائمة السياق، وبما أن عناصر القائمة لا يمكن أن تكون إلا فرعًا لقائمة واحدة، فقد بدت هذه طريقة معقولة للقيام بذلك.ونرحب بأي اقتراحات بديلة لهذا النهج.)

هل كانت مفيدة؟

المحلول

يمكنك العمل على العناصر أثناء حدث MouseDown لعنصر التحكم.تأكد من أنه زر الفأرة الأيمن أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top