2008-12-12 8 views
8

एक उदाहरण का वर्णन here है। लेकिन लेखक स्पष्ट रूप से डाउनलोड के लिए कोड शामिल करना भूल गए।जेनेरिक स्टेट मैनेज्ड कोलेक्शन कैसे बनाएं?

एक और उदाहरण दिखाया गया है here। हालांकि, यह काफी काम नहीं करता है (जैसा टिप्पणियों में वर्णित है)।

आप इसे सही तरीके से कैसे करते हैं?

+0

के डिजाइनर के साथ काम करें, यह एक [उदाहरण के लिए दूसरा अपडेट] [http://blog.spontaneouspublicity.com/child-collections-in-asp-net-custom-controls) –

+0

के लिए धन्यवाद नया। – Larsenal

उत्तर

3

डैनहेर्बर्ट ने इसे प्राप्त किया। डर्न, मैंने इस पर घंटों बिताए! इस प्रश्न का उत्तर देने की कोशिश करने की प्रक्रिया में मैं सरलीकृत जेनेरिक स्टेट मैनेज्ड कोलेक्शन के साथ आया था जो संस्करण here संस्करण के आधार पर ढांचे के अंतर्निहित राज्य मैनेज्ड कोलेक्शन से प्राप्त होता है। शायद आप इसे उपयोगी पाएंगे। मेरे नमूना प्रोजेक्ट का पूर्ण स्रोत कोड here उपलब्ध है।

using System; 
using System.Collections; 
using System.Collections.Specialized; 
using System.Security.Permissions; 
using System.Web; 
using System.Collections.Generic; 
using System.Web.UI; 

namespace Web 
{ 
    public abstract class StateManagedCollection<T> : StateManagedCollection, IList<T>, ICollection<T>, IEnumerable<T> 
     where T : class, IStateManagedItem, new() 
    { 

     protected override object CreateKnownType(int index) 
     { 
      return Activator.CreateInstance<T>(); 
     } 

     protected override Type[] GetKnownTypes() 
     { 
      return new Type[] { typeof(T) }; 
     } 

     protected override void SetDirtyObject(object o) 
     { 
      ((IStateManagedItem)o).SetDirty(); 
     } 

     #region IList<T> Members 

     public int IndexOf(T item) 
     { 
      return ((IList)this).IndexOf(item); 
     } 

     public void Insert(int index, T item) 
     { 
      ((IList)this).Insert(index, item); 
      if (((IStateManager)this).IsTrackingViewState) 
      { 
       this.SetDirty(); 
      } 
     } 

     public void RemoveAt(int index) 
     { 
      ((IList)this).RemoveAt(index); 
      if (((IStateManager)this).IsTrackingViewState) 
      { 
       this.SetDirty(); 
      } 
     } 

     public T this[int index] 
     { 
      get { return (T)this[index]; } 
      set { this[index] = value; } 
     } 

     #endregion 

     #region ICollection<T> Members 

     public void Add(T item) 
     { 
      ((IList)this).Add(item); 
      this.SetDirty(); 
     } 

     public bool Contains(T item) 
     { 
      return ((IList)this).Contains(item); 
     } 

     public void CopyTo(T[] array, int arrayIndex) 
     { 
      ((IList)this).CopyTo(array, arrayIndex); 
     } 

     public bool IsReadOnly 
     { 
      get { return false; } 
     } 

     public bool Remove(T item) 
     { 
      if (((IList)this).Contains(item)) 
      { 
       ((IList)this).Remove(item); 
       return true; 
      } 
      return false; 
     } 

     #endregion 


     #region IEnumerable<T> Members 

     IEnumerator<T> IEnumerable<T>.GetEnumerator() 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 

     #region IEnumerable Members 

     IEnumerator IEnumerable.GetEnumerator() 
     { 
      return ((IList)this).GetEnumerator(); 

     } 

     #endregion 
    } 
} 
+0

बाउंटी पुरस्कार के लिए कठिन विकल्प, लेकिन पूर्ण स्रोत कोड बहुत उपयोगी है। धन्यवाद। – Larsenal

+0

आप IENumerable लागू नहीं कर रहे हैं। GetEnumerator()। यदि आप .NET 3.5 का उपयोग कर रहे हैं, तो आप निम्न के साथ उस फेंक को प्रतिस्थापित कर सकते हैं: ((IENumerable ) यह) .स्ट () .GetEnumerator(); –

+0

क्या आप कृपया मुझे बता सकते हैं कि मैं नमूना स्रोत कोड कहां डाउनलोड कर सकता हूं? Coz 'आपके द्वारा दिया गया लिंक मुझे एक त्रुटि संदेश प्रदान करता है। –

4

second example you found लगभग काम करता है, यह बस थोड़ा सा गायब है। जो कुछ आवश्यक था वह मुख्य नियंत्रण में 2 विधियां थी।

इस कोड को AppointmentControl.cs फ़ाइल में जोड़ें और यह काम करेगा।

protected override object SaveViewState() 
{ 
    if (appointments != null) 
     return appointments.SaveViewState(); 
    return null; 
} 

protected override void LoadViewState(object savedState) 
{ 
    appointments = new AppointmentCollection(); 
    appointments.LoadViewState(savedState); 
} 

उदाहरण साइट में कोड बहुत सभ्य था। इसने सभी इंटरफेस को लागू किया और यह एक बहुत अच्छा काम किया। जहां यह अलग हो गया था, यह था कि, सार कोडों में आवश्यक सभी कोड होने के बावजूद, इससे कोई फर्क नहीं पड़ता क्योंकि उन जगहों पर इंटरफेस का संदर्भ नहीं दिया गया था जिन्हें उन्हें होना चाहिए था।

कुछ कक्षाओं को लागू करने के अलावा, संग्रह कक्षाओं का इस्तेमाल उनके बारे में "विशेष" नहीं था। ढांचा स्वचालित रूप से इन तरीकों को कॉल नहीं करेगा। ढांचे हालांकि ऊपर लिखे गए ओवरराइड विधियों को कॉल करेंगे, जिन्हें संग्रह में तत्वों को सहेजने के लिए आपके नियंत्रण के लिए आपको लागू करने की आवश्यकता है। जब तक आप उन्हें बुलाते हैं, सबकुछ काम करेगा।

0

मैं का इस्तेमाल किया है प्रदान की समाधान उपरोक्त कोड ठीक है, लेकिन मैं अपवाद हो रही थी - "StackOverflow 'कूल :) मुद्दा aspx पेज में कुछ बच्चे आइटम जोड़कर प्रतिलिपि प्रस्तुत करने योग्य है और करने के लिए डिज़ाइन दृश्य करने के लिए स्विच विजुअल स्टूडियो का डिज़ाइन व्यू (विजुअल स्टूडियो बस पुनरारंभ करें और कोई भी नहीं जानता कि क्या हो रहा है ....)।

IEnumerator IEnumerable.GetEnumerator() 
    { 
     return ((IList)this).GetEnumerator(); 

    } 

तो, मुझे लगता है मैं यह समझ से बाहर सिर्फ इस तरह उपरोक्त विधि के कार्यान्वयन को बदलने:

IEnumerator IEnumerable.GetEnumerator() 
    { 
     // return ((IList)this).GetEnumerator(); 
     return this.GetEnumerator(); 

    } 

आशा इस बाकी मेरे जैसे किसी को मदद मिलेगी :) बस कुछ ही घंटों खोना नहीं इसे वीएस

संबंधित मुद्दे