2011-12-12 78 views
1

我正在构建一个价格报价数据表(认为股票报价表)需要每5秒刷新一次。每行大约有一个股票的一些数据在几列和每一行的最后一列有LinkButton看到关于特定股票的更多信息。一切正常,但LinkButton。整个表嵌套在UpdatePanel我认为这是导致该问题的内部。我在这个主题上看到了相当多的帖子,但没有一篇适合我。LinkBut​​ton在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. 我尝试使用按钮,而不是了LinkBut​​ton但这并没有帮助。
  2. 我读了几十个帖子说要给LinkBut​​ton控件添加一个ID,但这也没有帮助。
+0

如果你试图掩盖使用链接按钮面板,你可能只是这样做在JavaScript。 –

回答

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(); 

代码话虽这么说,如果你想要做的是改变用户界面,很容易被用jQuery完成。

0

我相信这个问题是在页面生命周期,因为你正在创建一个动态控制和page_initpage_load,它没有得到迷上了正确的控制后加入的情况下,你可以尝试以下,看看如果它的工作原理:

添加页面初始化:

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

和计时器滴答事件更改为:

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

并且应该这样做。

希望这是帮助。

干杯。

0

您需要添加回发触发如下:

<asp:PostBackTrigger ControlID="SearchBrn"/> 
相关问题