首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问由CreateChildControls()创建的控件

访问由CreateChildControls()创建的控件
EN

Stack Overflow用户
提问于 2012-05-25 23:42:30
回答 2查看 2K关注 0票数 3

我需要从另一个类访问由CreateChildControls()创建的控件,以便在选择文件时有一个字符串上的路径可供引用。

我已经尝试过Accessing controls created dynamically (c#)Problem in accessing dynamically created controls的解决方案了,但是没有,joy,谢谢

代码语言:javascript
复制
    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

代码语言:javascript
复制
   protected void Button1_Click(object sender, EventArgs e)
    {
        AssetPicker asspi = new AssetPicker();

        string aaa = asspi.txtUrl.Text;



    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-26 01:01:35

我必须将控件设置为公共的,这样才能从另一个类访问。但它会返回空引用错误。我已经更新了最初的帖子

如果公开公开子控件,则需要在每个公开公开的子控件的getter中调用EnsureChildControls。这将强制执行CreateChildControls,从而构建您的控件树,确保调用者不会获得空引用。

例如:

代码语言:javascript
复制
public Button MyChildButton
{
    get
    {
        EnsureChildControls();
        return _myChildButton;
    }
}
private Button _myChildButton;

...

protected override void CreateChildControls()  
{
    ...
    _myChildButton = new Button();
    ... 
}

请注意,为此,您需要将子控件公开为属性,而不是字段。例如,在您的示例代码中,您需要替换:

代码语言:javascript
复制
public TextBox txtUrl;  

出自:

代码语言:javascript
复制
public TextBox TxtUrl
{
    get
    {
        EnsureChildControls();
        return txtUrl;
    }
}
private TextBox txtUrl;

您还应该继承CompositeControl,它对Controls属性执行类似的操作:

代码语言:javascript
复制
public override ControlCollection Controls
{
    get
    {
        EnsureChildControls();
        return base.Controls;
    }
}

如果由于某种原因你没有从CompositeControl继承,那么你需要将这个控件重写添加到你的类中。

顺便说一句,公开子控件可能会给调用者提供太多信息,而调用者可能不应该关心这样的实现细节。相反,您可以仅公开子控件的相关属性。例如,您可以公开一个字符串属性Url,而不是公开一个子TextBox TxtUrl

代码语言:javascript
复制
public string Url
{
    get
    {
        EnsureChildControls();
        return txtUrl.Text;            
    }
    set
    {
        EnsureChildControls();
        txtUrl.Text = value;
    }
}
票数 5
EN

Stack Overflow用户

发布于 2012-05-25 23:49:46

最后,当您向页面添加静态控件时,.NET所做的事情是,它会将引用作为控件的一个字段(它们通常指向.designer文件)。因此,只需以相同的方式将控件作为字段:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10757415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档