Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Организация редактора коллекций в PropertyGrid

60K
21 мая 2010 года
Lexxxxx
1 / / 21.05.2010
Имеется форма, на которой только PropertyGrig и код:

Код:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        //MyClass1 mycl1;

        public Form1()
        {
            InitializeComponent();
            MyClass1 mycl1 = new MyClass1();
            mycl1 = new MyClass1();
            mycl1.Ident = "Ид1";

            MyCollection mycoll = new MyCollection();
            mycoll.Add("первое_значение", new MyClass2());
            MyClass2 cl2 = new MyClass2();
            cl2.Ident2 = "Ид2";
            mycoll.Add("второе_значение", cl2);
            mycl1.coll = mycoll;

            //MyClass2 ggg = new MyClass2();
            //ggg.Ident2 = "fff";
            mycl1.coll2 = new List<MyClass2>();
            //mycl1.coll2.Add(ggg);
            //mycl1.coll2.Add(new MyClass2());

            propertyGrid1.SelectedObject = mycl1;
        }

        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Код, автоматически созданный конструктором форм Windows

        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        private void InitializeComponent()
        {
            this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
            this.SuspendLayout();
            //
            // propertyGrid1
            //
            this.propertyGrid1.Location = new System.Drawing.Point(12, 12);
            this.propertyGrid1.Name = "propertyGrid1";
            this.propertyGrid1.Size = new System.Drawing.Size(260, 240);
            this.propertyGrid1.TabIndex = 0;
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 264);
            this.Controls.Add(this.propertyGrid1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.PropertyGrid propertyGrid1;

    }

    public class MyClass1
    {
        string ident;

        [DisplayName("Идентификатор")]
        [Description("Идентификатор объекта")]
        [Category("Общие")]
        public string Ident
        {
            get
            {
                return ident;
            }

            set
            {
                ident = value;
            }
        }

        [DisplayName("Коллекция")]
        [Description("Моя коллекция")]
        [Category("Общие")]
        public MyCollection coll
        {
            get;
            set;
        }

        [DisplayName("Коллекция 2")]
        [Description("Моя коллекция 2")]
        [Category("Общие")]
        public List<MyClass2> coll2
        {
            get;
            set;
        }
    }

    public class MyCollection : Dictionary<string, MyClass2>, IList<MyClass2>, IList
    {
        List<MyClass2> _list;

        public MyCollection()
        {
            _list = new List<MyClass2>();
            _list.AddRange(base.Values);
        }

        public bool IsFixedSize { get { return false; } }

        public bool IsReadOnly { get { return false; } }

        MyClass2 IList<MyClass2>.this[int index]
        {
            get
            {
                return _list[index];
            }
            set
            {
                _list[index] = (MyClass2)value;
            }
        }

        public Object this[int index]
        {
            get
            {
                return _list[index];
            }
            set
            {
                _list[index] = value as MyClass2;
            }
        }

        public void RemoveAt(int index)
        {
            _list.RemoveAt(index);
        }

        public void Remove(object value)
        {
            _list.Remove(value as MyClass2);
        }

        public bool Remove(MyClass2 value)
        {
            return _list.Remove(value);
        }

        public void Insert(int index, MyClass2 value)
        {
            _list.Insert(index, value);
        }

        public void Insert(int index, object value)
        {
            _list.Insert(index, value as MyClass2);
        }

        public int IndexOf(MyClass2 value)
        {
            return _list.IndexOf(value);
        }

        public int IndexOf(object value)
        {
            return _list.IndexOf(value as MyClass2);
        }

        public bool Contains(MyClass2 value)
        {
            return _list.Contains(value);
        }

        public bool Contains(object value)
        {
            return _list.Contains(value as MyClass2);
        }

        public void Add(MyClass2 value)
        {
            _list.Add(value);
        }

        public int Add(object value)
        {
            _list.Add(value as MyClass2);
            return _list.Count - 1;
        }

        public void CopyTo(MyClass2[] value, int index)
        {
            _list.CopyTo(value, index);
        }

        IEnumerator<MyClass2> IEnumerable<MyClass2>.GetEnumerator()
        {
            return _list.GetEnumerator();
        }

    }

    public class MyClass2
    {
        string ident2;

        [DisplayName("Идентификатор 2")]
        [Description("Идентификатор объекта 2")]
        [Category("Общие")]
        public string Ident2
        {
            get
            {
                return ident2;
            }

            set
            {
                ident2 = value;
            }
        }

        public MyClass2() { }
    }

}


Хотелось бы редактировать значения коллекции в cl1.coll.
Однако редактор коллекций Добавляет туда значения типа System.Object, а не MyClass2. И при попытке повторно отредактировать коллекцию она оказывается пустой.
Как это побороть? Что я делаю не так?
Аноним
код сильно не смотрел - но если ты действительно добавляешь MyClass2
то тебе ничего не мешает извлекать данные как

Object obj = GetObjectFromPropGrid(); //твоя ф-ция доставания данных
MyClass2 myCl = (obj as MyClass2);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог