LinkButton不能在UpdatePanel中工作
本文关键字:工作 UpdatePanel 不能 LinkButton | 更新日期: 2023-09-27 18:17:32
我正在构建一个价格报价数据表(想想股票报价表),需要每5秒刷新一次。每行有几个列中的一个股票的一些数据,每行的最后一列有一个LinkButton
,可以查看有关该特定股票的更多信息。除了LinkButton
,其他都可以工作。整个表是嵌套在一个UpdatePanel
,我认为是导致问题。我看过很多关于这个话题的帖子,但没有一个对我有用。
<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
。这工作很好,如果我删除定时器。
我尝试过的事情:
- 我尝试使用按钮而不是LinkButtons,但这没有帮助。
- 我读了几十篇文章说要给LinkButton控件添加ID,但这也没有帮助。
我认为问题是当你添加控件。要做到这一点,需要在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完成。
我认为问题在于页面生命周期,因为您正在创建一个动态控件并在page_init
或page_load
之后添加事件,它没有正确地连接到控件,您可以尝试以下操作,看看它是否有效:
添加页面init:
protected void Page_Init(object sender, EventArgs e)
{
updateItemsTable();
}
并将计时器tick事件更改为:
protected void Timer_Tick(object sender, EventArgs e)
{
itemPanel.Update();
}
,这样就可以了。
希望对你有帮助。
欢呼。
您需要按如下方式添加回发触发器:
<asp:PostBackTrigger ControlID="SearchBrn"/>