LinkBut​​ton在UpdatePanel中不起作用

时间:2011-12-12 21:13:20

标签: c# asp.net updatepanel linkbutton

我正在建立一个价格报价数据表(想想股票报价表),需要每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. 我尝试使用Buttons而不是LinkBut​​tons,但这没有帮助。
  2. 我阅读了几十篇帖子,说要为LinkBut​​ton控件添加一个ID,但这也无济于事。

3 个答案:

答案 0 :(得分:1)

我认为问题出在你添加控件时。为此,需要在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();

话虽如此,如果您想要做的只是改变UI,那么可以通过jquery轻松完成。

答案 1 :(得分:0)

我认为问题出现在页面生命周期中,因为您正在创建动态控件并在page_initpage_load之后添加事件,它没有正确连接到控件,您可以尝试以下内容,看看它是否有效:

添加页面init:

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

并将计时器刻度事件更改为:

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

这应该可以解决问题。

希望这有帮助。

干杯。

答案 2 :(得分:0)

您需要添加回发触发器,如下所示:

<asp:PostBackTrigger ControlID="SearchBrn"/>