Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > DesignerSerialization свойства-коллекции


Автор: olyx 22.5.2008, 15:51
доброго вам всем времени суток. Пишу свой первый контрол - помогите чайнику smile

У контрола есть свойство - коллекция обьектов 
Код

        [TypeConverter(typeof(CollectionTypeConverter))]
        [DesignerSerializationVisibility( DesignerSerializationVisibility.Content)]
        public DataObjectProperetyCollection Items
        {
            get { return _Items; }
            set { _Items = value; }
        }

которая на этапе разработки редактируется стандартным CollectionEditor-ом.
Эта коллекция содержит обьекты некоторого типа DataObjectPropertyItem (тип для хранения чего-там-либо).
Код

class DataObjectProperetyCollection : ICollection , IList   
    {
        private DataObjectPropertyItem[] properties;
        private int propCount;

        public void CopyTo(Array array, int index)
        {
            Array.Copy(this.properties, 0, array, index, this.Count);
        }

        public int Count
        {
            get { return this.propCount; }
        }

        public bool IsSynchronized
        {
            get { return false; }
        }

        public object SyncRoot
        {
            get { return null; }
        }

        public IEnumerator GetEnumerator()
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public int Add(object value)
        {
            this.properties[this.propCount++] = (DataObjectPropertyItem)value;
            return (this.propCount - 1);
        }

        public void Clear()
        {
            this.propCount = 0;
        }

        public bool Contains(object value)
        {
            return (this.IndexOf(value) >= 0);
        }

        public int IndexOf(object value)
        {
            return Array.IndexOf<DataObjectPropertyItem>(this.properties, (DataObjectPropertyItem)value, 0, this.propCount);
        }

        public void Insert(int index, object value)
        {
            if (index < this.propCount)
            {
                Array.Copy(this.properties, index, this.properties, index + 1, this.propCount - index);
            }
            this.properties[index] = (DataObjectPropertyItem)value;
            this.propCount++;
        }

        public bool IsFixedSize
        {
            get { return false; }
        }

        public bool IsReadOnly
        {
            get { return false; }
        }

        public void Remove(object value)
        {
            int index = this.IndexOf(value);
            if (index != -1)
            {
                this.RemoveAt(index);
            }
        }

        public void RemoveAt(int index)
        {
            if (index < (this.propCount - 1))
            {
                Array.Copy(this.properties, index + 1, this.properties, index, (this.propCount - index) - 1);
            }
            this.properties[this.propCount - 1] = null;
            this.propCount--;
        }

        public object this[int index]
        {
            get
            {
                return this[index];
            }
            set
            {
                if (index >= this.propCount)
                {
                    throw new IndexOutOfRangeException();
                }
                if ((value != null) && !(value is DataObjectPropertyItem))
                {
                    throw new ArgumentException("value");
                }
                this.properties[index] = (DataObjectPropertyItem)value;
            }

        }
    }

делал по советам сзятым с http://www.realcoding.net/article/view/4411. Реализацию интерфейсов ICollection , IList взял из 
.нет библиотеки при помощи рефлектора.

Проблема 1
свойство контрола указывает на коллекцию обьектов определенного типа. А в дизайн-тайм в редакторе коллекции светится Object.

Проблема 2
даже если в коллекцию я добавляю несколько элементов, то при закрытии редактора коллекции свойсто Items контрола не сохраняется. Ругается на The object '<мой контрол>' returned null for the property Items but this is not allowed. Т.е. насколько я понимаю редактор коллекций не возращает то что я там добавил, и соответственно свойство Items = null.

Подскажите плиз, ато уж который день бьюсь над задачей smile


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)