无法在动态创建的System.Web.UI.WebControl上使用Control.FindControl

时间:2014-07-15 21:38:39

标签: asp.net .net

为什么以下代码不起作用?我正在创建一个控件,添加一个子控件并尝试使用.FindControl方法通过id检索它。

[Test]
    public void TryToFindControl()
    {
        var myPanel = new Panel();
        var textField = new TextBox
        {
            ID = "mycontrol"
        };
        myPanel.Controls.Add(textField);

        var foundControl = myPanel.FindControl("mycontrol");

        // this fails
        Assert.IsNotNull(foundControl);
    }

3 个答案:

答案 0 :(得分:2)

面板尚未添加到页面,因此您无法使用 FindControl 。相反,您需要在 Panel.Controls

中找到它
[TestMethod]
public void TryToFindControl()
{
    var myPanel = new Panel();
    var textField = new TextBox
    {
        ID = "mycontrol"
    };
    myPanel.Controls.Add(textField);

    var foundControl = myPanel.Controls
        .OfType<TextBox>()
        .FirstOrDefault(x => x.ID == "mycontrol");

    Assert.IsNotNull(foundControl);
}

使用Page

进行测试

FindControl 仅在容器添加到Page时才有效。

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var myPanel = new Panel();
        var textField = new TextBox
        {
            ID = "mycontrol"
        };
        myPanel.Controls.Add(textField);

        Controls.Add(myPanel);

        // foundControl is not null anymore!
        var foundControl = myPanel.FindControl("mycontrol");
    }
}

答案 1 :(得分:1)

控件必须是要找到的服务器端Page控件集合层次结构的一部分。

public void TryToFindControl()
{
    var myPanel = new Panel();

    // key line here
    Page.Controls.Add(myPanel); 

    var textField = new TextBox
    {
        ID = "mycontrol"
    };

    myPanel.Controls.Add(textField);

    var foundControl = myPanel.FindControl("mycontrol");

    Assert.IsNotNull(foundControl);
}

答案 2 :(得分:0)

首先,我将从System.UI.Control开始形成我不知道的事实,而不是System.Web.UI.Control

然后我找不到TextField控件,所以我使用了网络TextBox。请根据需要调整您的代码。我还使用了VS Test属性

    [TestMethod()]
    public void TryToFindControl()
    {
        var editContainer = new HtmlTableCell();
        editContainer.Controls.Add(new TextBox
        {
            ID = "mycontrol",
        });

        System.Web.UI.Control foundControl = null;

        foreach (System.Web.UI.Control ctrl in editContainer.Controls)
        {
            if (ctrl.ID == "mycontrol")
            {
                foundControl = ctrl;
                break;
            }
        }

        // This works
        Assert.IsNotNull(foundControl);
    }

根据您的确切措辞,如果您想要访问您添加的控件,请首先创建一个实例作为变量,以便您可以直接访问它。请记住,我不知道你想要在全球范围内实现什么,所以我的答案可能不适用于此,或者可能有更好的解决方案。

    [TestMethod()]
    public void TryToFindControl()
    {
        var editContainer = new HtmlTableCell();

        var foundControl = new TextBox
        {
            ID = "mycontrol"
        };

        editContainer.Controls.Add(foundControl);

        // This works
        Assert.IsNotNull(foundControl);
    }