Установка AssociatedControlID для метки не удалась

У меня есть составной элемент управления, который добавляет элемент TextBox и Label к его коллекции элементов управления. Когда я пытаюсь установить AssociatedControlID метки в ClientID текстового поля, я получаю эту ошибку

Unable to find control with id 
'ctl00_MainContentPlaceholder_MatrixSetControl_mec50_tb'
that is associated with the Label 'lb'. 

Хорошо, так немного фона. Я получил этот основной композитный элемент управления, который динамически добавляет ряд "элементов" в свою коллекцию элементов управления. Одним из этих элементов является MatrixTextBox, который является элементом управления, состоящим из TextBox и Label.

Я держу Label и TextBox как защищенные переменные класса и инициирую их в CreateChildControls:

    ElementTextBox = new TextBox();
    ElementTextBox.ID = "tb";
    Controls.Add(ElementTextBox);

    ElementLabel = new Label();
    ElementLabel.ID = "lb";
    Controls.Add(ElementLabel);

Я пытался установить

ElementLabel.AssociatedControlID = ElementTextBox.ClientID;

оба сразу после добавления элементов управления в коллекцию Controls и даже в PreRender - оба дают одинаковую ошибку. Что я делаю неправильно?

2 ответа

Решение

Я думаю, что вы не должны использовать свойство ClientID ElementTextBox, но идентификатор. ClientID - это уникальный идентификатор страницы, который вы должны использовать в Javascript, например, в document.getElementyById, и он не совпадает с идентификатором на стороне сервера, особенно если у вас есть главная страница и / или элементы управления в элементах управления и т. Д.

Так и должно быть:

ElementLabel.AssociatedControlID = ElementTextBox.ID;

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

Возможно, полезно для других читателей, которые сталкиваются с ошибкой:

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

private void AddRadioButton(PlaceHolder placeholder, string groupname, string text)
{
    RadioButton radio = new RadioButton();
    radio.GroupName = groupname;
    radio.ID = Guid.NewGuid().ToString(); // Always set an ID.

    Label label = new Label();
    label.Text = text;
    label.AssociatedControlID = radio.ID;

    placeholder.Controls.Add(radio);
    placeholder.Controls.Add(label);
}
Другие вопросы по тегам