Когда вы обнаружите, что дочерний элемент управления добавляется в ваш пользовательский элемент управления, добавьте обработчик к его родительскому событию (вы также захотите добавить его в своего рода список, чтобы вы могли избежать добавления нескольких обработчиков просто для безопасности) , затем, если родительский объект снова изменяется, проверьте родительское свойство элемента управления, инициирующего событие (и зациклите родительскую цепочку, если она находится в контейнере с вашим пользовательским элементом управления) - если вы не нашли себя, выдайте ошибку snide сообщение типа «Я завидую контролю, которому не нравится, когда мои дети выходят из-под моего контроля».
В вашем пользовательском контроле (простите за полупсуедуокод, я делаю весь этот ответ во время копирования файла: -)
dim ControlsProcessed as List (of Control)
sub OnControlAdded(sender as obj...) handles MyBase.ControlAdded
if not in design mode, exit sub
dim ctl as control = ctype(sender,control)
if ControlsProcessed.Contains(ctl) then exit sub
ControlsProcessed.Add(ctl)
addhandler ctl.ControlAdded,addressof (OnControlAdded) ' So you can monitor containers within yourself
addhandler ctl.ParentChanged, addressof(OnParentChanged)
end sub
sub OnParentChanged(sender as object, e as ....)
dim ctl as control = ctype(sender,control)
dim pctl as control = ctl.parent
while pctl isnot nothing
if pctl is me then exit sub
[ if you want to allow moving to others of your kind: if typeof pctl is (mytype) then exit sub]
wend
Throw now applicationexception ("You sneaky devil you can't do that!")
End Sub
Вид непроверенной идеи, конечно, я понятия не имею, что вы пытаетесь сделать; надеюсь, что это работает!