Доступ к элементам управления, добавленным программно при обратной передаче

При обратной передаче. Как я могу получить доступ к элементам управления ASP.NET в моем файле кода программной части, которые добавляются программно?

Я добавляю элемент управления CheckBox в элемент управления Placeholder:

PlaceHolder.Controls.Add(new CheckBox { ID = "findme" });

Элементы управления, добавленные в файл ASPX, отлично отображаются в Request.Form.AllKeys, за исключением тех, которые я добавляю программно. Что я делаю неправильно?

Включение использования ViewState в элементах управления не помогает. Если бы это было так просто :)


person cllpse    schedule 19.11.2009    source источник
comment
вы создали динамический контроль в событии инициализации?   -  person Muhammad Akhtar    schedule 19.11.2009


Ответы (3)


Вам следует воссоздать свой динамический контроль при обратной передаче:

protected override void OnInit(EventArgs e)
{

    string dynamicControlId = "MyControl";

    TextBox textBox = new TextBox {ID = dynamicControlId};
    placeHolder.Controls.Add(textBox);
}
person ika    schedule 19.11.2009
comment
Разве это не сбросило бы состояние элемента управления? - person cllpse; 19.11.2009
comment
Нет, не будет. Для правильной загрузки состояния требуется один и тот же идентификатор динамического элемента управления - каждый раз, когда вы его воссоздаете. - person ika; 19.11.2009

CheckBox findme = PlaceHolder.FindControl("findme");

Это то, что вы имели ввиду?

person Nick Spiers    schedule 19.11.2009
comment
Не совсем. Я хочу получить доступ к элементу управления обратной передачей. - person cllpse; 19.11.2009

Вам нужно будет добавить динамически добавляемый элемент управления во время Page_Load, чтобы каждый раз правильно строить страницу. И затем в вашем (я предполагаю, что нажатие кнопки) вы можете использовать метод расширения (если вы используете 3.5), чтобы найти динамический элемент управления, который вы добавили в Page_Load

    protected void Page_Load(object sender, EventArgs e)
    {
        PlaceHolder.Controls.Add(new CheckBox {ID = "findme"});
    }

    protected void Submit_OnClick(object sender, EventArgs e)
    {
        var checkBox = PlaceHolder.FindControlRecursive("findme") as CheckBox;
    }

Метод расширения найден здесь

public static class ControlExtensions
{
    /// <summary>
    /// recursively finds a child control of the specified parent.
    /// </summary>
    /// <param name="control"></param>
    /// <param name="id"></param>
    /// <returns></returns>
    public static Control FindControlRecursive(this Control control, string id)
    {
        if (control == null) return null;
        //try to find the control at the current level
        Control ctrl = control.FindControl(id);

        if (ctrl == null)
        {
            //search the children
            foreach (Control child in control.Controls)
            {
                ctrl = FindControlRecursive(child, id);
                if (ctrl != null) break;
            }
        }
        return ctrl;
    }
}
person Mark Coleman    schedule 19.11.2009
comment
Разве это не сбросило бы состояние элемента управления? - person cllpse; 19.11.2009
comment
Если флажок установлен (true) на веб-странице во время Page_Load, он будет считан как false, однако в обработчике событий для нажатия кнопки он будет иметь правильное значение отмечено (true) - person Mark Coleman; 19.11.2009