Почему пустой PlaceHolder

AlexW
Дата: 31.03.2010 00:09:53
Привет всем!

Столкнулся со следующей проблемой.

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

Подскажите, пожалуйста, что это такое может быть и как с ним бороться?

Спасибо.
rinat mergenbaev
Дата: 31.03.2010 08:18:56
AlexW
Привет всем!

Столкнулся со следующей проблемой.

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

Подскажите, пожалуйста, что это такое может быть и как с ним бороться?

Спасибо.


может проблема, что ты не создаешь каждый раз динам. контролы?
oleginn
Дата: 31.03.2010 13:52:10
AlexW
Привет всем!

Столкнулся со следующей проблемой.

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

Подскажите, пожалуйста, что это такое может быть и как с ним бороться?

Спасибо.

Динамические контролы не воссоздаются на постбеке автоматически. Их надо восстанавливать самому, увы. Делать это можно по разному. Для того же, что бы сработали события от тех контролов, которые лежат в плейсхолдере, необходимо их воссоздавать теми же самыми что и до постбека, иначе жди беды.
Zoria
Дата: 31.03.2010 14:13:20
Скажу больше :)
Динамически создаваемые контролы нужно восстанавливать (т.е создавать и добавлять на страницу) при каждом постбэке, в обработчике события станицы не позднее Page_Load, и присваивать им те же ID, что и при первом добавлении на страницу.
oleginn
Дата: 31.03.2010 15:27:53
Zoria
Скажу больше :)
Динамически создаваемые контролы нужно восстанавливать (т.е создавать и добавлять на страницу) при каждом постбэке, в обработчике события станицы не позднее Page_Load, и присваивать им те же ID, что и при первом добавлении на страницу.

И даже больше )) Свойства динамических контролов, которые восстанавливаются автоматически (например, Value у TextBox) не перебиваются даже на Page_Load и приходится все это делать на PreRender. В общем, тут довольно много всяких "сюрпризов", с которыми приходится бороться то там то сям))
Zoria
Дата: 31.03.2010 15:45:33
oleginn
Zoria
Скажу больше :)
Динамически создаваемые контролы нужно восстанавливать (т.е создавать и добавлять на страницу) при каждом постбэке, в обработчике события станицы не позднее Page_Load, и присваивать им те же ID, что и при первом добавлении на страницу.

И даже больше )) Свойства динамических контролов, которые восстанавливаются автоматически (например, Value у TextBox) не перебиваются даже на Page_Load и приходится все это делать на PreRender. В общем, тут довольно много всяких "сюрпризов", с которыми приходится бороться то там то сям))

а вот это вы что-то тучи сгущаете. примерчик покажите-ка?:)
oleginn
Дата: 31.03.2010 16:32:13
Zoria
oleginn
Zoria
Скажу больше :)
Динамически создаваемые контролы нужно восстанавливать (т.е создавать и добавлять на страницу) при каждом постбэке, в обработчике события станицы не позднее Page_Load, и присваивать им те же ID, что и при первом добавлении на страницу.

И даже больше )) Свойства динамических контролов, которые восстанавливаются автоматически (например, Value у TextBox) не перебиваются даже на Page_Load и приходится все это делать на PreRender. В общем, тут довольно много всяких "сюрпризов", с которыми приходится бороться то там то сям))

а вот это вы что-то тучи сгущаете. примерчик покажите-ка?:)


ASPX:
......
<form id="form1" runat="server">
    <div>
        <asp:PlaceHolder runat=server ID="ph"></asp:PlaceHolder><br /><br />
        <input type="submit" runat=server id="submit" value="Submit" />
    </div>
</form>
......

ASPX.CS:
......
public partial class Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        TextBox tb1 = new TextBox();
        
        ph.Controls.Add(tb1);
        tb1.Text = ""; // чистим текстбокс
    }
    /*
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        TextBox tb1 = (TextBox)ph.Controls[0];
        tb1.Text = ""; // чистим текстбокс
    }
    */
}
================================

Если исполнить в таком варианте, то после постбэка значение текстбокса не очистится.
Если разкоментить, то очистится. Так вот))
Модератор: Отредактировано
используйте тэг SRC
Zoria
Дата: 31.03.2010 17:01:19
oleginn,

а в чем смысл очистки текстового поля в вашем примере?
Он не очищается именно потому что после события Page_Load восстанавливаются значения из ViewState, в примере с текстовым боксом - ControlState.
Как правило, именно этого от контролов и хотят - чтобы они донесли на сервер значения, заданные на клиенте.
Eсли эти значения не нужны, можете восстанавливать контролы, позднее события Load, например, LoadComplete
oleginn
Дата: 31.03.2010 17:37:01
Zoria
oleginn,

а в чем смысл очистки текстового поля в вашем примере?
Он не очищается именно потому что после события Page_Load восстанавливаются значения из ViewState, в примере с текстовым боксом - ControlState.
Как правило, именно этого от контролов и хотят - чтобы они донесли на сервер значения, заданные на клиенте.
Eсли эти значения не нужны, можете восстанавливать контролы, позднее события Load, например, LoadComplete

Ну, например, удалить пробелы сначала и с конца, очистить поле ввода пароля или капчи, да мало ли что еще. Понятно, что все решаемо. Просто запутанно многое, что мне кажется могло бы быть гораздо проще.
Zoria
Дата: 31.03.2010 17:40:00
oleginn,

3 волшебных слова - Page Life Cycle :)