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() { }
}
}
Организация редактора коллекций в PropertyGrid
Код:
Хотелось бы редактировать значения коллекции в cl1.coll.
Однако редактор коллекций Добавляет туда значения типа System.Object, а не MyClass2. И при попытке повторно отредактировать коллекцию она оказывается пустой.
Как это побороть? Что я делаю не так?
то тебе ничего не мешает извлекать данные как
Object obj = GetObjectFromPropGrid(); //твоя ф-ция доставания данных
MyClass2 myCl = (obj as MyClass2);