Как сохранить динамический контроль (c #) - PullRequest
1 голос
/ 06 апреля 2011

В соответствии с заголовком я создал пользовательский элемент управления.

При определенном событии нажатия кнопки этот элемент управления создается, а затем добавляется на страницу.

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

Чтобы эти события кнопок были запущены, элемент управления должен быть отрисован к концу Page_Load / OnLoad на последующей стадии жизненного цикла page_load / onload.

Моя проблема в том, как мне сохранить этот контроль?Я не могу сохранить его в объекте Session, поскольку он содержит несериализуемые элементы.

Ответы [ 4 ]

3 голосов
/ 06 апреля 2011

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

2 голосов
/ 06 апреля 2011

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

Чтобы динамически добавить элемент управления после нажатия кнопки, установите в обработчике щелчка какой-либо флаг (постоянный флаг - поэтому он должен быть в viewstate или в sessionstate) - он должен указывать, что при создании следующей страницы ваш элемент управления должен быть добавлен к нему. После этого вы должны установить ChildControlsCreated = false;
После этого CreateChildControls выполняются снова, и ваш элемент управления создается правильно и является постоянным (до тех пор, пока вы не очистите флаг).

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

protected override void CreateChildControls()
{
        base.CreateChildControls();
    if (ViewState["AddControl"] == true)
        {
         Controls.Add(new MyControl() {Id = "someId" });
        }
}

И BTN Handler

private void OnShowControlClick(object sender, EventArgs e)
{
         ViewState["AddControl"] = true;
         ChildControlsCreated = false;
}
0 голосов
/ 06 апреля 2011

Как и для всех HTML-страниц, элемент управления должен быть заново создан при каждом запросе страницы.ASP.NET обрабатывает большую часть этого «под капотом» с помощью таких механизмов, как ViewState и Session.

Если ваш элемент управления не отслеживается (или не может отслеживаться) с помощью ViewState, то вам нужно справиться с этим самостоятельно..

Я не знаю, насколько сложен ваш контроль, но в качестве отправной точки вы можете прочитать об обработке события CreateChildControls здесь (MSDN)

0 голосов
/ 06 апреля 2011

Полагаю, все, что вам нужно сделать, это воссоздать его с тем же идентификатором во время предварительной инициализации, и механизм asp.net заполняет его из состояния просмотра.

Это не в моей голове, так чтоЯ мог бы немного уточнить детали.

...