سؤال

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

للأسف، عندما يتم تعطيل القائمة حالة العرض وإعادات النشر ولدت <م> من جانب القائمة لا يثير أي أحداث. إذا أنا تمكين حالة العرض، يتم رفع الحدث OnMenuItemClick. إذا كنت تعطيل حالة العرض، لا يتم رفع OnMenuItemClick. أنا في حيرة.

وأنا بحاجة إلى ترك حالة العرض خارج لقائمة، لذلك كيف يمكنني التعامل مع إعادات النشر من القائمة الفعلية؟

وعند هذه النقطة أنا يميل نحو استخدام الحدث Load القائمة، وتحليل __EVENTTARGET لمعرفة ما اذا كان القائمة، والذهاب من هناك. ومن شأن هذه العملية من الناحية الفنية الحدث إعادة النشر قبل أن تفعل عادة ولكن هذا على ما يرام، وانا اعتقد.

وأي أفكار أفضل؟

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

المحلول 2

ولقد برزت جوهر المشكلة. باستخدام العاكس يمكننا أن نرى جزءا هاما (ق) من طريقة المستوى المنخفض التي تتولى إعادة النشر الفعلي ومن ثم يرفع الحدث:

string str = HttpUtility.HtmlDecode(eventArgument);
...
MenuItem item = this.Items.FindItem(str.Split(new char[] { '\\' }), 0);
if (item != null)
    this.OnMenuItemClick(new MenuEventArgs(item));

وكما ترون في MenuEventArgs وسلم MENUITEM. إذا كان أحد لا يمكن العثور عليها في مجموعة العناصر الحالية التي تتوافق مع البيانات الواردة آخر، ثم لا يظهر الحدث. مع حالة العرض تعطيل، لا يملك أي من البنود القائمة (كانوا قد تم بناؤها باستخدام حالة العرض). لذلك لن يتم رفع الحدث.

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

وأنا اهدر الكثير من الوقت على هذا، لذلك نأمل هذه المعلومات يمكن أن تساعد شخص آخر في وضع مماثل.

نصائح أخرى

نعم، يمكنك اختيار إما استخدام حالة العرض لإعادة ملء عنصر تحكم منضم أو يمكنك DataBind عناصر من قبل وتطلق الأحداث (Page_Load على ما يرام).

وأود أن لا تربط بالضرورة دائما من جديد في Page_PreRender رغم ذلك، إذا لم يتغير شيء على هذا إعادة النشر (تغيرات حدثت في مكان آخر على الصفحة) ثم ليس هناك ما يدعو إلى ربط ذلك مرة أخرى.

وبدلا من ذلك قد تكون قادرة على ربط فقط على أحداث معينة عندما تعلم أنها سوف تضطر إلى تغيير.

في Page_Load rebind عنصر التحكم إلى sitemapdata ومعرفة ما اذا كان IsPostBack.

if (IsPostBack) {
            Menu.DataBind();
}

وهذا العمل بالنسبة لي، والحد من حالة العرض.

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