C # مشكلة WM6 الاتفاق الإطاري الصليب الموضوع الاتصالات

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

سؤال

وأواجه مشكلة أثناء تحديث عنصر تحكم في بلدي واجهة المستخدم من موضوع تم إنشاؤها باستخدام

ThreadPool.QueueUserWorkItem

وداخل هذا الموضوع وانا داعيا

addControlToPanel(li);

وكما هو مبين هنا

private delegate void addControlToPanelDelegate(ListItem li);
private void addControlToPanel(ListItem li)
{
    if (panel1.InvokeRequired)
    {
        addControlToPanelDelegate d = new addControlToPanelDelegate(addControlToPanel);
        panel1.Invoke(d, new object[] { li });
    }
    else
    {
        panel1.Controls.Add(li);
    }
}

في أول دخول لaddControlToPanel () panel1.InvokeRequired == صحيح حتى يتم إنشاء مثيل مندوب ثم الاحتجاج، والآن على هذا الدخول في addControlToPanel ()، panel1.InvokeRequired == false بحيث يمكنني إضافة عنصر التحكم إلى لوحة.

ومشكلتي هي أنه حتى بعد استدعاء ضد السيطرة وpanel1.InvokeRequired كونها كاذبة أحصل على خطأ على

panel1.Controls.Add(li); 

وخط تفيد المعتاد

ويجب أن تستخدم Control.Invoke للتفاعل مع الضوابط التي تم إنشاؤها على موضوع منفصل.

وأي شخص يمكن أن بقعة المشكلة؟ عن طريق استدعاء للوصول إلى ضوابط على موضوع آخر شيء قمت به مرات عديدة من قبل ولكن هذا واحد لي الحيرة!

وTIA

وOneSHOT

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

المحلول

ويبدو أن المشكلة كانت تمر عنصر تحكم في الاحتجاج (عنصر القائمة هو عنصر تحكم نموذج أنني خلقت) بدلا ط ريفاكتوريد التعليمات البرمجية بحيث أنه بدلا من خلق مراقبة ويمر عليه في

addControlToPanel()

وطريقة، أنا تمرير كل المعلومات اللازمة لإنشاء عنصر التحكم داخل الأسلوب بعد استدعاء وذلك

private delegate void addControlToPanelDelegate(string picname, string thumburl, PicasaEntry entry, Int32 top, EventHandler clickevent);
private void addControlToPanel(string picname, string thumburl, PicasaEntry entry, Int32 Ordinal,EventHandler clickevent)
{
    if (panel1.InvokeRequired)
    {
        addControlToPanelDelegate d = new addControlToPanelDelegate(addControlToPanel);
        this.Invoke(d, new object[] { picname, thumburl, entry, Ordinal, clickevent });
        //panel1.Invoke(d, new object[] { li });
    }
    else
    {
        ListItem li = new ListItem(picname, thumburl, entry);
        li.Top = Ordinal * li.Height;
        li.Click += clickevent;
        panel1.Controls.Add( li);
    }
}

وهتاف

وOneSHOT

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