我不得不让控制控制程序公开, 才能从另一类上进入。 但是它反亮了无效引用错误 。 我已经更新了最初的文章 。
如果您公开暴露了对孩子的控制,您需要在每次公开曝光的孩子们的控制中,在获取器中调用 Sure child Controls
。这将强制执行 CreateChild Controls
,因此您要建造控制树,确保拨打者不会获得无效引用。
例如:
public Button MyChildButton
{
get
{
EnsureChildControls();
return _myChildButton;
}
}
private Button _myChildButton;
...
protected override void CreateChildControls()
{
...
_myChildButton = new Button();
...
}
请注意,要做到这一点,您需要将您的子控件暴露为属性,而不是字段。即,在您的样本代码中,您需要替换:
public TextBox txtUrl;
以:
public TextBox TxtUrl
{
get
{
EnsureChildControls();
return txtUrl;
}
}
private TextBox txtUrl;
您还应该继承 Compiosite Controlation
的遗产,因为 control
对 controls
属性有类似之处:
public override ControlCollection Controls
{
get
{
EnsureChildControls();
return base.Controls;
}
}
如果您出于某种原因没有继承 Compiosite control control
, 那么您需要将此控件添加到您的类中 。
顺便提一下, 曝光儿童控制可能会给您的打电话者太多信息, 他们可能不应该关注此执行细节。 相反, 您只能披露您控制孩子的相关属性 。 例如, 您可能暴露一个孩子 TextBox TxtUrl
, 而不是孩子 TextBox < code> TxtUrl , 您可能暴露一个字符串属性 < code> Url :
public string Url
{
get
{
EnsureChildControls();
return txtUrl.Text;
}
set
{
EnsureChildControls();
txtUrl.Text = value;
}
}