访问由 CreateChildControls() 创建的控件
本文关键字:创建 控件 CreateChildControls 访问 | 更新日期: 2023-09-27 18:35:31
我需要从另一个类访问 CreateChildControls() 创建的控件,以便当我选择文件时,我有字符串上的路径可以引用。
我已经尝试了访问动态创建的控件(c#)和访问动态创建的控件的问题中的解决方案,但没有快乐谢谢
publicTextBox txtUrl;
protected override void CreateChildControls()
{
Label lblUrl = new Label();
lblUrl.ID = "lblUrl";
lblUrl.Text = "Url: ";
Controls.Add(lblUrl);
TextBox txtUrl = new TextBox();
txtUrl.ID = "txtUrl";
Controls.Add(txtUrl);
AssetUrlSelector picker = new AssetUrlSelector();
picker.ID = "ausUrl";
picker.DefaultOpenLocationUrl = OpenUrl;
picker.AssetUrlClientID = txtUrl.ClientID;
picker.AssetUrlTextBoxVisible = false;
Controls.Add(picker);
Control control = Page.LoadControl(_ascxPath);
Controls.Add(control);
}
从另一个类中,我应该能够访问文本框
protected void Button1_Click(object sender, EventArgs e)
{
AssetPicker asspi = new AssetPicker();
string aaa = asspi.txtUrl.Text;
}
我必须公开控件才能从另一个类访问。 但它会重新调整空引用错误。我已经更新了最初的帖子
如果公开子控件,则需要在 getter 中为每个公开的子控件调用EnsureChildControls
。 这将强制执行CreateChildControls
,从而构建控制树,确保调用方不会获得 null 引用。
例如:
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;
您还应该从 CompositeControl
继承,它对 Controls
属性执行类似操作:
public override ControlCollection Controls
{
get
{
EnsureChildControls();
return base.Controls;
}
}
如果由于某种原因您没有从 CompositeControl
继承,则需要将此控件重写添加到您的类中。
顺便说一下,公开子控件可能会向调用方提供太多信息,而调用方可能不应该关注此类实现详细信息。 相反,您可以只公开子控件的相关属性。 例如,您可以公开字符串属性,而不是公开子文本框TxtUrl
,Url
如下:
public string Url
{
get
{
EnsureChildControls();
return txtUrl.Text;
}
set
{
EnsureChildControls();
txtUrl.Text = value;
}
}
最后,当您将静态控件添加到页面时,.NET 的作用是,它将保存控件的引用作为字段(它们通常转到 .designer 文件)。因此,只需以相同的方式将控件作为字段放置:
private Label lblUrl;
private TextBox txtUrl;
private AssetUrlSelector picker;
private Control control;
protected override void CreateChildControls()
{
lblUrl = new Label();
lblUrl.ID = "lblUrl";
lblUrl.Text = "Url: ";
Controls.Add(lblUrl);
txtUrl = new TextBox();
txtUrl.ID = "txtUrl";
Controls.Add(txtUrl);
picker = new AssetUrlSelector();
picker.ID = "ausUrl";
picker.DefaultOpenLocationUrl = OpenUrl;
picker.AssetUrlClientID = txtUrl.ClientID;
picker.AssetUrlTextBoxVisible = false;
Controls.Add(picker);
control = Page.LoadControl(_ascxPath);
Controls.Add(control);
}