Сериализация массива нестандартного контрола в код
От: Daenur Россия  
Дата: 20.07.05 10:27
Оценка:
Есть нестандартный контрол, содержащий массив 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'ом и т.п.
(_2B || !_2B)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.