Я пытаюсь создать динамическую таблицу с некоторыми текстовыми полями в зависимости от списка объектов. Затем я добавляю его в панель, содержащуюся в UpdatePanel.Динамические элементы управления в UpdatePanel не всегда поднимаются асинхронно
Все работает отлично, за исключением того, что несколько раз обратная передача является асинхронной, а несколько раз перезагружается вся страница. Нет правила, несколько раз он будет работать дважды, прежде чем быть полной обратной передачей, и несколько раз больше. Невозможно найти логику с этим поведением.
Вот кусок моего ASPX кода:
<asp:UpdatePanel ID="udpTableDechets" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Panel ID="pnlTableDechets" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
Вот часть моего кода позади:
protected override void OnLoad(EventArgs e)
{
generateTableDechets();
base.OnLoad(e);
}
private void generateTableDechets()
{
Table tbl = new Table { ID = "dechets", ClientIDMode = ClientIDMode.Static };
TableRow trDec = new TableRow();
tbl.Controls.Add(trDec);
TableCell tdDecReel = new TableCell();
trDec.Controls.Add(tdDecReel);
TextBox txtDechet = new TextBox { ID = string.Concat("txtDechet_", product.Nom), ClientIDMode = ClientIDMode.Static, AutoPostBack = true };
txtDechet.TextChanged+=new EventHandler(txtDechet_TextChanged);
tdDecReel.Controls.Add(txtDechet);
pnlTableDechets.Controls.Add(tbl);
}
protected void txtDechet_TextChanged(object sender, EventArgs e)
{
// Get the value, and update the object containing values
// Then update labels in table thanks to another method
}
UPDATE 1
На самом деле, я попробовал то же самое в статике, и у меня точно такое же поведение.
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:TextBox runat="server" AutoPostBack="true" OnTextChanged="txt_TextChanged" />
</ContentTemplate>
</asp:UpdatePanel>
Нормальное, ли? Это известная ошибка? Я что-то прощаю? Как сделать так, чтобы каждый запрос textChanged выполнялся асинхронно. Заранее спасибо за ответы
Update 2
Проблема, кажется, происходит, когда я нажимаю клавишу ввода, или когда я блика содержимое текстового поля, чтобы заменить его.
Решение
я, наконец, сделал это благодаря IPostBackEventHandler интерфейсу (see here).
Я управляю событием вручную и поймаю его в методе RaisePostBackEvent(). Таким образом, здесь, благодаря идентификатору элемента управления, переданному в параметре, я могу делать свои вещи.
Спасибо за ваши ответы
, где вы обновляете панель обновления? поскольку он является условным –
Я сделал Update(), но элементы управления находятся в пределах updatePanel, поэтому нет необходимости вызывать метод Update. –