2013-06-19 4 views
0

Я пытаюсь создать динамическую таблицу с некоторыми текстовыми полями в зависимости от списка объектов. Затем я добавляю его в панель, содержащуюся в 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(). Таким образом, здесь, благодаря идентификатору элемента управления, переданному в параметре, я могу делать свои вещи.

Спасибо за ваши ответы

+0

, где вы обновляете панель обновления? поскольку он является условным –

+0

Я сделал Update(), но элементы управления находятся в пределах updatePanel, поэтому нет необходимости вызывать метод Update. –

ответ

0

Это Comman проблема при создании веб-сайта, которые содержат динамические элементы управления. Если вы хотите запускать событие каждый раз, когда вы должны вызывать код позади javascript. Поскольку javascript выполняется каждый раз.

ex.

function SaveClick() { 
      Page.GetPostBackEventReference(objBtnSave); 
      __doPostBack("objBtnSave", "OnClick"); 
     } 

Возможно, это решит вашу проблему.

+0

Проблема не в том, чтобы стрелять из событий, она всегда срабатывает.Но какое-то время асинхронно, некоторое время синхронно –

+0

Вы ставите меня на путь с GetPostBackEventReference. Я отвечу на вопрос, чтобы ответить. Спасибо за ваш ответ –

0

В статическом режиме я сделал это, добавив свойство ChildrenAsTriggers = "true" или указав AsyncPostBackTrigger для каждого динамического элемента управления с помощью события TextChanged.

Но это не работает с моим динамическим кодом.

Смежные вопросы