Переопределение свойства Controls панели в C#

Мне нужно переопределить метод Add свойства «Controls» myControl, который расширен из панели управления Windows. Для этого я расширил класс ControlCollection до MyControlCollection, где я переопределил его метод Add. Теперь я объявил свойство Controls типа MyControlCollection, чтобы скрыть свойство Controls панели. Когда я получаю доступ к this.Controls.Add(control), это относится к переопределенному методу добавления. Но если я перетащу элемент управления в myControl, поведение будет соответствовать методу добавления базового типа. Может ли кто-нибудь предложить причину и средство для решения этой проблемы? Заранее спасибо.


person Lalit    schedule 24.10.2008    source источник


Ответы (3)


Вместо этого вы можете переопределить функцию CreateControlCollection и вернуть экземпляр класса по вашему выбору, который наследует System.Web.UI.ControlCollection. Удалите свойство Controls из своего класса, вам не нужно переопределять или скрывать исходную реализацию.

person baretta    schedule 24.10.2008
comment
О, прикольно - я не знал об этом. Я думаю, что я все равно попытался бы не требовать моей собственной ControlCollection, если это возможно, но приятно знать, что это можно сделать :) - person Jon Skeet; 24.10.2008
comment
В окнах нет такого переопределяемого метода управления. - person Lalit; 24.10.2008
comment
извините, мой плохой ... Думаю, я прочитал ваш пост слишком быстро и подумал, что вы находитесь в контексте ASP.NET. Однако в Windows Forms вы можете сделать то же самое, переопределив функцию CreateControlsInstance. - person baretta; 24.10.2008

Причина в том, что дизайнер вызывает Control.Controls, а не обращается к вашей отдельной коллекции. Честно говоря, ваше решение звучит так, как будто ему суждено вызвать проблемы — обычно это происходит при скрытии участников.

Чего именно вы пытаетесь достичь? Не похоже, что в ControlCollection есть хорошее событие, к которому можно подключиться, но может быть другой способ решения проблемы.

РЕДАКТИРОВАТЬ: я только что видел, что Control имеет ControlAdded событие — будет ли вам достаточно подписки на него?

person Jon Skeet    schedule 24.10.2008
comment
Я должен ограничить добавление элементов управления в myControl на основе некоторого свойства. ControlAdded срабатывает после добавления нового элемента управления в родительский элемент по адресу 0,0. после чего он перемещает элемент управления в нужное положение. Если я удалю этот новый элемент управления из родительского элемента в EventHandler ControlAdded, возникнет исключение. - person Lalit; 24.10.2008

На самом деле я должен ограничить добавление элементов управления в свой элемент управления, если некоторые флаги верны. Я использовал это событие ControlAdded, но оно только добавило проблем. ControlAdded срабатывает только после добавления этого элемента управления в родительский элемент в позиции 0, 0. После возникновения этого события он перемещает элемент управления в соответствии с положением мыши во время удаления. Если я удалю этот новый элемент управления из родительского элемента в ControlAdded, произойдет исключение EventHandler.

person Lalit    schedule 24.10.2008
comment
Старая тема, но вы когда-нибудь находили решение для этого? Я также хотел бы ограничить добавление элементов управления в Panel. :-) - person ab-tools; 22.03.2020