ASP.NET Custom Control - Контейнер именования - PullRequest
0 голосов
/ 25 июня 2010

У меня есть 2 пользовательских элемента управления, я используется как контейнер для другого:

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

Контейнер mc имеет внутреннее свойство по умолчанию, называемое content, которое является коллекцией MyControls.

Разметка выше находится внутри FormView, и когда я вызываю FindControl в форме, он может найти контейнер, но не может найти тест.

Как я могу сделать так, чтобы контейнер не управлялсоздать новый контейнер именования?

РЕДАКТИРОВАТЬ __

Если его нет в FormView, идентификаторы внутреннего элемента управления отображаются как часть страницы в конструкторе, поэтому он работает.

РЕДАКТИРОВАТЬ __

Вот мой 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 Ответ

6 голосов
/ 25 июня 2010

Краткий ответ - вы не можете.Класс UserControl наследуется от TemplateControl , который реализует интерфейс INamingContainer .Это означает, что все пользовательские элементы управления являются именованными контейнерами, и в случае вложения FindControl не будет работать.

Решение будет заключаться в реализации рекурсивного поиска для элемента управления в иерархии,Обход коллекции Controls каждого элемента, если он не находит элемент управления на самом верхнем уровне.Вот пример реализации этого: http://stevesmithblog.com/blog/recursive-findcontrol/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...