Page Lifecycle - использование FindControl для ссылки на элемент управления, созданный программно во время загрузки страницы - PullRequest
2 голосов
/ 10 октября 2008

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

Я поместил инструкцию FindControl в метод загрузки страницы после кода, который их создает, но выдает ошибку:

Ссылка на объект не установлена ​​для экземпляра объекта.

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

Может кто-нибудь посоветовать, где в моем коде позади мне нужно разместить инструкцию FindControl, чтобы он мог найти эти программно созданные текстовые поля?

Ответы [ 6 ]

3 голосов
/ 10 октября 2008

Вы поместили свой текстовый элемент управления в другой элемент управления, такой как панель или сетка? Если это так, вам нужно рекурсивно искать все элементы управления на странице.

Вот пример рекурсивной реализации FindControl: Рекурсивная Page.FindControl . Вы можете найти много других примеров, прибегая к помощи "recursive findcontrol".

2 голосов
/ 10 октября 2008

Если вы создаете текстовые поля программно, вы можете напрямую использовать их для управления ими. Нет необходимости в FindControl (который также будет медленнее)

TextBox txt = new TextBox();
...
txt.Text = "Text";

Если вам нужен доступ в разных методах, вы можете просто сделать txt закрытой переменной класса.

Если вам действительно нужно использовать FindControl - добавляются ли текстовые поля на странице (добавляются в список элементов управления страницы) при вызове функции?

1 голос
/ 26 октября 2008

только что нашел эту функцию из сообщения в блоге Стила Прайса, и она отлично работала. Я пытался сослаться на usercontrol внутри страницы, на которой была главная страница, ничего, что я пытался сработать, кроме этого. Поместите это в один из ваших основных классов. Прочитайте сообщение Стила в блоге для более подробной информации.

Если вы поместите это в класс, вам нужно получить контрольную ссылку, например:

Dim imgStep2PreviewIcon As Image = Eyespike.Utilities.FindControl(Of Control)(Page, "imgStep1PreviewIcon")
imgStep2PreviewIcon.Visible = False

Код VB.NET

Public Shadows Function FindControl(ByVal id As String) As Control
    Return FindControl(Of Control)(Page, id)
End Function

Public Shared Shadows Function FindControl(Of T As Control)(ByVal startingControl As Control, ByVal id As String) As T
    Dim found As Control = startingControl
    If (String.IsNullOrEmpty(id) OrElse (found Is Nothing)) Then Return CType(Nothing, T)
    If String.Compare(id, found.ID) = 0 Then Return found
    For Each ctl As Control In startingControl.Controls
        found = FindControl(Of Control)(ctl, id)
        If (found IsNot Nothing) Then Return found
    Next
    Return CType(Nothing, T)
End Function

C # (не проверено, сгенерировано с использованием converter.telerik.com )

public new Control FindControl(string id)
{
    return FindControl<Control>(Page, id);
}

public static new T FindControl<T>(Control startingControl, string id) where T : Control
{
    Control found = startingControl;
    if ((string.IsNullOrEmpty(id) || (found == null))) return (T)null; 
    if (string.Compare(id, found.ID) == 0) return found; 
    foreach (Control ctl in startingControl.Controls) {
        found = FindControl<Control>(ctl, id);
        if ((found != null)) return found; 
    }
    return (T)null;
}
1 голос
/ 10 октября 2008

Если вы добавляете текстовые поля в CreateChildControls, вам может потребоваться вызвать EnsureChildControls, прежде чем получить к ним доступ.

1 голос
/ 10 октября 2008

Во время загрузки страницы все элементы управления должны быть настроены и готовы к использованию. Элементы управления инициализируются и во время фазы инициализации, которая находится перед фазой загрузки.

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

0 голосов
/ 10 октября 2008

Если вы сделаете свои элементы управления TextBox во время переопределения OnInit (до вызова base.OnInit (e), я полагаю), они будут доступны во время Page.OnLoad и любых связанных событий. Вы также помещаете их в граф объектов ViewState в правильном положении, что неоценимо для работы с постбеками и особенно для проверки на стороне сервера.

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