То, что у вас есть на данный момент, не , что плохо, ваш дочерний компонент имеет ссылку на родительский элемент, и это нормально.
Это, однако, проблема
public void DillerDaller()
{
PUI.dynamicPanel.Controls.Add(new Label { Location = new Point(10, 10), Name="textName", Text = "hello"});
}
На базовом уровне вы нарушаете принцип инкапсуляции, где dynamicPanel
- это protected
внутри формы, так что он недоступен извне. Наследование дочернего компонента из главной формы не является правильным решением.
На более высоком уровне вы нарушаете здесь так называемый Закон Деметры , где не следует злоупотреблять внутренними деталями реализации компонента. Изменение видимости dynamicPanel
на public
не поможет. Скорее, правило гласит, что вы должны обернуть такие детали реализации стабильным интерфейсом
public partial class ParentInterface : Form
{
...
public void AddDynamicPanelControl( Control control ) {
this.dynamicPanel.Controls.Add( control );
}
public void RemoveDynamicPanelControl( Control control ) {
this.dynamicPanel.Controls.Remove( control );
}
}
и использовать недавно представленный интерфейс
public void DillerDaller()
{
var label = new Label { Location = new Point(10, 10), Name="textName", Text = "hello"};
this.PUI.AddDynamicPanelControl( label );
// if you store the reference to the label somewhere,
// you'll be able to call `Remove....` to remove this control from
// the form
}