在aspx页面上查找动态添加的控件

时间:2010-12-14 21:31:50

标签: asp.net asp.net-ajax asp.net-2.0 code-behind

我有一个asp页面“A”,我创建了一个用户控件“B”

当我做A.Controls.Add(B)时,我想创建一个元素,比如在控件“B”中定义的TableRow,通过后面的代码看不见。

查看“A”的控件时,我似乎无法找到该表格行。

任何提示?

我确信这是一件非常简单的事我不知道。

谢谢。

3 个答案:

答案 0 :(得分:2)

您应该将可修改且可从外部访问的控件公开为属性。  MSDN

但是考虑不要暴露整个控件本身但只考虑f.e.文本框的文本属性,因为它可以防止无意和不可预测的行为。 用户控件应该封装复杂性,并且应该(大部分)可重用。您对使用usercontrol的控件(即页面)提供的控制越多,可重用性越低,错误率就越高。

例如,如果您使用用户名的文本框和密码的文本框构建了一个Login-Control,则提供名为Username和Password的属性而不是返回Textboxes本身是有意义的。每个属性都返回相应的Textbox-Text值。

在你的TableRow示例中,它的目的是什么?您应该公开一个具有有意义名称的属性来控制其可见性(如果该行包含标题,则为ShowTitle,getter / setter将返回/设置实际的tablerow的可见状态。)

当然,如果要访问其属性,则需要引用UserControl。如果您在页面上找到它时遇到问题,则应提供源代码。这取决于您创建和添加它的位置。通常,您会在FindControl上找到NamingContainer的控件(例如,GridView的TemplateColumn中定义的控件的NamingContainer是GridViewRow本身)。

答案 1 :(得分:1)

您可以使用Page中的FindControl方法通过其ID查找特定控件, 我不确定你是否想要找到你已添加的UserControl'A'或其中的控件,你应该能够使用相同的方法在内部找到控件,只要你知道Id和if this table row是通过xml声明的,它设置了runat =“server”属性。

希望它有所帮助!

答案 2 :(得分:1)

我喜欢使用递归扩展方法 - 无论嵌套等如何都能很好地工作。你可以破解它以返回具有特定ID的控件。

Param Parent 可以是任何控件,包括Webform或UserControl :-)

    //Recursively get all the Controls within parent
    public static IEnumerable<Control> GetAllControls(this Control parent)
    {
        foreach (Control control in parent.Controls)
        {
            yield return control;
            foreach (Control descendant in control.GetAllControls())
            {
                yield return descendant;
            }
        }
    }