Доступ к элементам управления добавлен программно при обратной передаче - PullRequest
2 голосов
/ 19 ноября 2009

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 19 ноября 2009

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

protected override void OnInit(EventArgs e)
{

    string dynamicControlId = "MyControl";

    TextBox textBox = new TextBox {ID = dynamicControlId};
    placeHolder.Controls.Add(textBox);
}
0 голосов
/ 19 ноября 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;
    }
}
0 голосов
/ 19 ноября 2009
CheckBox findme = PlaceHolder.FindControl("findme");

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

...