我需要从另一个类访问由CreateChildControls()创建的控件,以便在选择文件时有一个字符串上的路径可供引用。
我已经尝试过Accessing controls created dynamically (c#)和Problem in accessing dynamically created controls的解决方案了,但是没有,joy,谢谢
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);
}从另一个类中,我应该能够访问textbox
protected void Button1_Click(object sender, EventArgs e)
{
AssetPicker asspi = new AssetPicker();
string aaa = asspi.txtUrl.Text;
}发布于 2012-05-26 01:01:35
我必须将控件设置为公共的,这样才能从另一个类访问。但它会返回空引用错误。我已经更新了最初的帖子
如果公开公开子控件,则需要在每个公开公开的子控件的getter中调用EnsureChildControls。这将强制执行CreateChildControls,从而构建您的控件树,确保调用者不会获得空引用。
例如:
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继承,那么你需要将这个控件重写添加到你的类中。
顺便说一句,公开子控件可能会给调用者提供太多信息,而调用者可能不应该关心这样的实现细节。相反,您可以仅公开子控件的相关属性。例如,您可以公开一个字符串属性Url,而不是公开一个子TextBox TxtUrl:
public string Url
{
get
{
EnsureChildControls();
return txtUrl.Text;
}
set
{
EnsureChildControls();
txtUrl.Text = value;
}
}发布于 2012-05-25 23:49:46
最后,当您向页面添加静态控件时,.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);
}https://stackoverflow.com/questions/10757415
复制相似问题