ASP.NET自定义控件 - 命名容器

时间:2010-06-25 13:01:57

标签: asp.net user-controls

我有2个用户控件,我用作另一个的容器:

<mc:Container runat="server" ID="container">
   <mc:MyControl runat="server" ID="test">
</mc:Container>

mc Container有一个名为content的默认内部属性,它是MyControls的集合。

上面的标记位于FormView内,当我在formview上调用FindControl时,它可以找到容器,但找不到测试。

如何让容器控件不创建新的命名容器?

EDIT __

当不在FormView中时,内部控件的ID会显示为设计器中页面的一部分,因此它正在工作。

EDIT __

这是我对容器的vb:

<ParseChildren(True, "Content")> _
Partial Public Class ctrFormContainer
    Inherits System.Web.UI.UserControl

    Private _content As FormControlCollection
    <PersistenceMode(PersistenceMode.InnerDefaultProperty), _
    TemplateInstance(TemplateInstance.Single)> _
    Public Property Content() As FormControlCollection
        Get
            Return _content
        End Get
        Set(ByVal value As FormControlCollection)
            _content = value
        End Set
    End Property

    Protected Overrides Sub CreateChildControls()
        If _content IsNot Nothing Then
            ctrChildren.Controls.Clear()
            For Each i As FormControl In _content
                ctrChildren.Controls.Add(i)
            Next
        End If
        MyBase.CreateChildControls()

    End Sub

    Public Overrides Function FindControl(ByVal id As String) As System.Web.UI.Control
        Return MyBase.FindControl(id)
    End Function

    Public Class FormControlCollection
        Inherits List(Of FormControl)
    End Class
End Class

1 个答案:

答案 0 :(得分:6)

简短回答 - 你不能。 UserControl 类继承自 TemplateControl ,它实现 INamingContainer 接口。这意味着所有用户控件都是命名容器,在嵌套的情况下, FindControl 将不起作用。

解决方案是对层次结构中的控件执行递归搜索,如果在最顶层找不到控件,则遍历每个项的控件集合。这是一个示例实现: http://stevesmithblog.com/blog/recursive-findcontrol/