2012-01-03 35 views
13

在我的頁面中,我有一個LinkBut​​ton內部中繼器,但UpdatePanel找不到LinkBut​​ton爲AsyncPostBackTrigger。如何爲中繼器中的LinkBut​​ton執行AsyncPostBackTrigger

這裏是mycode.aspx

<asp:ScriptManager ID="Test1" runat="server" /> 
<asp:UpdatePanel ID="TestUpdate" runat="server" UpdateMode="Always"> 
<ContentTemplate> 
<table width="100%"> 
<tr valign="top"> 
    <td width="50%"> 
     <asp:Repeater ID="productList" runat="server" onitemcommand="productList_ItemCommand"> 
     <HeaderTemplate> 
     <ul type="disc"> 
     </HeaderTemplate> 
     <ItemTemplate> 
     <li> 
      <asp:Label id="L1" runat="server" Text='<%# Eval("productName") %>'></asp:Label><br /> 
      Price: 
      <asp:Label runat="server" Text='<%# Eval("productPrice") %>' ></asp:Label>&nbsp;Bath<br /> 
      <img alt="" src="Images/product/product<%# Eval("productID") %>.png" style="width: 200px; height: 130px" /><br /> 
      <asp:TextBox ID="num_product" runat="server" Text="0"></asp:TextBox><br /> 
      <asp:LinkButton ID="order_button" runat="server"><img alt="" src="~/Images/button/order.png" /></asp:LinkButton> 
     </li> 
     </ItemTemplate> 
     <FooterTemplate> 
     </ul> 
     </FooterTemplate> 
     </asp:Repeater> 
    <td> 
    <span class="labelText">Order list</span> 
     <asp:BulletedList ID="orderList" runat="server" BulletStyle="Numbered"> 
     </asp:BulletedList> 
    </td> 
</tr> 
</table> 
</ContentTemplate> 
</asp:UpdatePanel> 

這裏是mycode.aspx.cs

protected void productList_ItemCommand(object source, RepeaterCommandEventArgs e) 
    { 
     //button 
     /*LinkButton btn = new LinkButton(); 
     btn.ID = "order_button"; 
     btn.Click += LinkButton1_Click; 
     Test1.RegisterAsyncPostBackControl(btn);*/ 

     LinkButton btn = (LinkButton)e.Item.FindControl("order_button"); 
     btn.Click += LinkButton1_Click; 
     Test1.RegisterAsyncPostBackControl(btn); 

      /*AsyncPostBackTrigger trigger = new AsyncPostBackTrigger(); 
      trigger.ControlID = btn.ClientID; 
      trigger.EventName = "Click"; 
      TestUpdate.Triggers.Add(trigger);*/ 

    } 
    protected void LinkButton1_Click(object sender, EventArgs e) 
    { 
     //string name = ProductName1.Text.ToString(); 
     //int price = System.Convert.ToInt32(ProductPrice1.ToString(), 10); 
     //int number = System.Convert.ToInt32(TextBox1.ToString(),10); 
     //orderList.Items.Clear(); 
     //orderList.Items.Add(new ListItem(name)); 
     //ListItem product1 = new ListItem(); 
     //product1.Text = name; 
     orderList.Items.Add("test"); 
    } 

我試過很多方法,但頁面仍然刷新。你有什麼建議嗎?

回答

41

Repeater控件內部ItemCreated事件在ScriptManager中註冊該按鈕。

//Inside ItemCreatedEvent 
ScriptManager scriptMan = ScriptManager.GetCurrent(this); 
LinkButton btn = e.Item.FindControl("order_button") as LinkButton; 
if(btn != null) 
{ 
    btn.Click += LinkButton1_Click; 
    scriptMan.RegisterAsyncPostBackControl(btn); 
} 
+0

謝謝你很多。是工作!!! – user1128331 2012-01-04 15:18:31

+0

謝謝尤金。爲我節省了很多時間。乾杯 – 2014-06-11 08:02:17

+0

我需要做與此相反的事情 - 使中繼器中的鏈接按鈕做一個完整的回發,而不是從updatepanel內的異步回發。這完美的工作。我只是用'scripMan.RegisterPostBackControl(btn)'代替。 – ahwm 2017-01-12 19:02:55

11

添加以下屬性頁面指令包含中繼器和的LinkBut​​ton也將工作:

​​

我有這樣的需要工作異步和完全回發控制,所以使用ScriptManager.RegisterAsyncPostBackControl不適用於我。通過在UpdatePanel中包含控件(包含一箇中繼器和linkbutton),linkbutton會導致異步回發。沒有更新面板,linkbutton會導致一個fullpostback。

希望這可以幫助別人。

12

我有類似的問題,但我不想更新整個直放站,僅中繼器以外的內容...所以我所做的就是

1.添加中繼

<asp:Repeater ID="productList" runat="server"> 
    <!-- my repeater --> 
<asp:Repeater> 

2.添加與更新內容更新面板,並且觸發

<asp:UpdatePanel ID="up" runat="server"> 
    <ContentTemplate> 
     <!-- when the click on repeater's links, this content will be updated --> 
    </ContentTemplate> 
    <Triggers> 
     <!-- trigger will be the repeater's links/btn that generate postback --> 
     <asp:AsyncPostBackTrigger ControlID="productList" /> 
    </Triggers> 
</asp:UpdatePanel> 
+1

非常感謝分享!正是我想要做的:-) – Oliver 2014-04-05 01:09:21

+0

我更喜歡這一個 – Yorro 2016-05-04 08:24:56