ctl00_CPHContent в .net - PullRequest
       11

ctl00_CPHContent в .net

0 голосов
/ 17 февраля 2010

Я использую главные страницы vb.net, а .net помещает ctl00 $ CPHContent $ и ctl00_CPHContent_ перед идентификатором элемента управления и именем элемента управления.

Я пытаюсь использовать findControl для поиска своего элемента управления, но он не находит элементы управления.

любые идеи или предложения ..... Я не могу использовать javascript, чтобы найти решение

Ответы [ 3 ]

6 голосов
/ 17 февраля 2010

Генерация идентификатора вы видите потому, что ваши элементы управления находятся внутри другого элемента управления, который реализует INamingContainer. Вся цель этого состоит в том, чтобы разрешить шаблонные элементы управления - например, каждая строка сетки данных может иметь TextBox с идентификатором «TextBox1». Очевидно, что все текстовые поля не могут иметь одинаковый идентификатор - поэтому DataGrid определяет эти элементы управления с префиксом для их идентификаторов.

Большинство элементов управления Asp.Net, имеющих коллекции Controls, реализуют INamingContainer (например, Panel).

INamingContainer не мешает функциональности FindControl. Например, вы все еще можете искать «TextBox1» внутри каждой строки DataGrid из приведенного выше примера.

Возможно, проблема в том, что вы не вызываете FindControl() в нужном контейнере (Page.FindControl не рекурсивен - он ищет только элементы управления непосредственно внутри собственной коллекции Controls.)

Если вам нужна рекурсивная версия FindControl(), я добавлю код в этот старый ответ .

1 голос
/ 17 февраля 2010

Это может быть немного грубой силой, но вы можете настроить ее под свои нужды.

Я поместил эту функцию в свой класс базовой страницы, который позволяет мне находить элемент управления в любом месте contentBody ContentPlaceHolder:

''' <summary>Finds a control on a page, even if the page is from a master page</summary>
''' <param name="id">Id of control to find on page</param>
''' <returns>The control object, if found</returns>
Public Function FindAControl(ByVal id As String) As Control
    Dim result As Control = Nothing
    Dim contentBody As Control = Me.Controls(0).FindControl("contentBody")
    If contentBody IsNot Nothing Then
        result = contentBody.FindControl(id)
    Else
        result = Me.FindControl(id)
    End If
    Return result
End Function

В вашей MasterPage у вас есть что-то вроде этого:

<asp:ContentPlaceHolder ID="contentBody" runat="server"/>

Идентификатор, который вы видите там, это то, что вы вставили:

Dim contentBody As Control = Me.Controls(0).FindControl("contentBody")
1 голос
/ 17 февраля 2010

На стороне сервера в своем коде VB.NET вы сможете найти свой элемент управления по идентификатору, который вы ему дали. Итак, если у вас было что-то вроде

Вы можете получить к нему доступ на стороне сервера, вызвав FindControl ("myPlaceHolder"). То, что вы видите, «ctl00_CPHPContent_» - это способ .NET убедиться, что у каждого элемента во внешнем интерфейсе (читай: HTML) есть уникальные идентификаторы по всем направлениям, поэтому он дает свои имена, обозначающие его местоположение на странице и т. Д.

Итак, если я правильно вас понимаю, вы используете FindControl ("ctl100_CPHPContent_myPlaceHolder"), и он обнуляется? Или вы используете FindControl ("myPlaceHolder"), и он не находит элемент управления?

Еще одна вещь, которую нужно иметь в виду, как вы получаете контроль на странице? Вы записываете его в файл aspx или ascx или динамически создаете в VB.NET? Если это позднее, убедитесь, что вы создаете динамические элементы управления во время правильной стадии жизненного цикла страницы, то есть в Page_Init.

Надеюсь, это немного поможет.

...