LinkButton не работает в UpdatePanel - PullRequest
1 голос
/ 13 декабря 2011

Я строю таблицу данных для котировок цен (например, таблицу котировок акций), которую необходимо обновлять каждые 5 секунд. Каждая строка содержит данные об одном складе в нескольких столбцах, а последний столбец в каждой строке имеет LinkButton, чтобы увидеть больше информации об этом конкретном складе. Все работает, кроме LinkButton. Вся таблица вложена в UpdatePanel, что, я думаю, вызывает проблему. Я видел довольно много сообщений на эту тему, но ни один из них не работал для меня.

Вот мой код .aspx:

<asp:ScriptManager ID="ScriptManager" runat="server" />
<asp:Timer ID="Timer" OnTick="Timer_Tick" runat="server" Interval="5000" />

<div id="itemList">
    <asp:UpdatePanel ID="itemPanel" UpdateMode="Conditional" ChildrenAsTriggers="false" runat="server">
        <Triggers><asp:AsyncPostBackTrigger ControlID="Timer" /></Triggers>
        <ContentTemplate>    
                <asp:Panel ID="Panel_ItemList" runat="server" width="100%"></asp:Panel>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>

и мой код .aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    ...

    if (!Page.IsPostBack) 
    {
        updateItemsTable();
    }
}

protected void LinkButton_Click(object sender, CommandEventArgs e)
{
        Panel_LoginAlert.Visible = true;    // <-- THIS IS NOT FIRING!!
}

protected void Timer_Tick(object sender, EventArgs e)
{
    updateItemsTable();
}

protected void updateItemsTable()
{
    //... Query my DB

        if (rdr.HasRows)
        {
            Panel_ItemList.Controls.Add(new LiteralControl("<!-- ItemList Panel -->\n"));

            while (rdr.Read())
            {
                LinkButton lb = new LinkButton();
                lb.Text = "Item";
                lb.ID = "lbItem_" + strDBitemID;
                lb.CommandName = strDBitemName;
                lb.CommandArgument = strDBitemID;
                lb.Command += new CommandEventHandler(LinkButton_Click);
                Panel_ItemList.Controls.Add(lb);
            }
            Panel_ItemList.Controls.Add(new LiteralControl("<!-- END ItemList Panel -->\n"));
        }
    //...
    conn.Close();
}

Таким образом, страница загружается нормально, а таймер перезагружает таблицу, но LinkButtons не запускает CommandEventHandler. Это работает нормально, если я уберу Таймер.

Вещи, которые я пробовал:

  1. Я пытался использовать кнопки вместо LinkButtons, но это не помогло.
  2. Я прочитал десятки постов, в которых говорилось о добавлении идентификатора в элементы управления LinkButton, но это тоже не помогло.

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

Я считаю, что проблема в том, когда вы добавляете элементы управления. Чтобы это работало, необходимо добавить серверные элементы управления в событие Init или переопределить OnInit (EventArgs).

Вместо явного создания элементов управления вы можете заменить панель повторителем. Затем свяжите свои результаты из базы данных с читателем.

<asp:Repeater ID="TheRepeater" ...>
   <ItemTemplate>
      <asp:LinkButton onClick="LinkButton_Click" ...bind values to properties here />
   </ItemTemplate>
</asp:Repeater>

код позади

TheRepeater.Visible = rdr.HasRows;
TheRepeater.DataSource = rdr;
TheRepeater.DataBind();

Это, как говорится, если все, что вы хотите сделать, это изменить пользовательский интерфейс, это можно легко сделать с помощью jquery.

0 голосов
/ 06 февраля 2013

Вам необходимо добавить триггер обратной передачи следующим образом:

<asp:PostBackTrigger ControlID="SearchBrn"/>
0 голосов
/ 13 декабря 2011

Я полагаю, что проблема заключается в жизненном цикле страницы, поскольку вы создаете динамический элемент управления и добавляете событие после page_init или page_load, когда оно неправильно подключается к элементу управления, вы можете попробовать и посмотрите, работает ли он:

Добавить страницу инициализации:

protected void Page_Init(object sender, EventArgs e)
{
    updateItemsTable();
}

и измените событие отметки таймера на:

protected void Timer_Tick(object sender, EventArgs e)
{
   itemPanel.Update();
}

и это должно сработать.

Надеюсь, это поможет.

Приветствие.

...