Есть нестандартный контрол, содержащий массив Button'ов. На основе этого массива он строит таблицу и размещает их как надо. Проблема такая: требуется прикрутить к контролу свойство, чтоб в DesignTime можно было работать с этим массивом. Сейчас сделано так:
Контрол:
public class ToolBarControl : System.Web.UI.Control,
INamingContainer, IStateManager
{
#region Поля класса
private ArrayList buttons;
...
#endregion
#region Свойства в инспекторе свойств
[Editor(typeof(ButtonsArrayEditor), typeof(UITypeEditor)),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public ArrayList Buttons
{
get
{
return this.buttons;
}
set
{
this.buttons = value;
}
}
...
#endregion
/// <summary>
/// Конструктор ToolBarControl
/// </summary>
public ToolBarControl()
{
this.ID = "ToolBarControl1";
this.buttons = new ArrayList(this.rowCount * this.cellCount);
#region Создаем таблицу в которой будут размещены все компоненты
table = new Table();
...
#endregion
#region Cоздание и заполнение ячеек (строк и столбцов) из массива кнопок
for (int r = 0; r < this.rowCount; r++)
{
TableRow row = new TableRow();
row.ID = "toolBarRow" + (r + 1).ToString();
for (int c = 0; c < this.cellCount; c++)
{
TableCell cell = new TableCell();
cell.ID = "toolBarCell" + (c + 1).ToString();
row.Controls.Add(cell);
}
this.table.Controls.Add(row);
}
#endregion
}
#region Методы добавления и удаления элементов(кнопок)
public void AddButton(ImageButton btn)
{
if (buttons.Count >= rowCount * cellCount)
throw new IndexOutOfRangeException("Список полон! Добавление новых элементов невозможно.");
// добавляем кнопку в массив
this.buttons.Add(btn);
// определяем номер строки и столбца таблицы куда надо поместить эту кнопку
...
// добавляем кнопку в ячейку
table.Rows[r].Cells[c].Controls.Add(btn);
}
public void RemoveButton(ImageButton btn)
{
...
}
#endregion
...
}
Editor:
public class ButtonsArrayEditor : CollectionEditor
{
public ButtonsArrayEditor() : base(typeof(ArrayList))
{}
protected override Type CreateCollectionItemType()
{
return typeof(ImageButton);
}
}
Тестовая страничка:
public class TestToolBarForm : System.Web.UI.Page
{
protected ToolBarControl ToolBarControl1;
private void Page_Load(object sender, System.EventArgs e)
{
ImageButton btn1 = new ImageButton();
btn1.ID = "btn1";
ToolBarControl1.AddButton(btn1);
}
}
Все это работает, если создавать кнопки и добавлять их контролу на тестовой странице. Но если воспользоваться PropertyGrid'ом в DesignTime, то ничего не получается.
В коде страницы появляется запись:
<TOOLBARCONTROL:TOOLBARCONTROL id="TNSToolBarControl1" runat="server">
<asp:ImageButton ImageUrl="imageButton1"></asp:ImageButton>
</TOOLBARCONTROL:TOOLBARCONTROL>
которая ни на что не влияет. И даже после просто компиляции проекта PropertyGrid не покажет только что добавленный элемент.
А хочется чтобы все работало как у ListControl'ов. Т.е. из этих записей можно было формировать внутренний массив, просматривать его PropertyGrid'ом и т.п.