LinkButton не работает в UpdatePanel

Я создаю таблицу данных для ценовых котировок (например, таблицу котировок акций), которую необходимо обновлять каждые 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. Это отлично работает, если я удалю Timer.

Что я пробовал:

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

person vanbruiser    schedule 12.12.2011    source источник
comment
Если вы пытаетесь скрыть панель с помощью кнопки ссылки, вы можете просто сделать это в javascript.   -  person PMC    schedule 13.12.2011


Ответы (3)


Я считаю, что проблема заключается в том, что вы добавляете элементы управления. Чтобы это работало, серверные элементы управления необходимо добавить в событие 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.

person Jason Meckley    schedule 12.12.2011

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

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

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

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

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

и это должно помочь.

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

Ваше здоровье.

person Pablo Lopez    schedule 12.12.2011

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

<asp:PostBackTrigger ControlID="SearchBrn"/>
person Altaf Patel    schedule 06.02.2013