2012-01-03 17 views
13

Na mojej stronie, mam wzmacniacz LinkButton wewnątrz, ale UpdatePanel nie może znaleźć LinkButton do AsyncPostBackTrigger.Jak zrobić AsyncPostBackTrigger dla LinkButton w Repeater

Oto 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> 

Oto 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"); 
    } 

Próbowałem wielu metod, ale strona jest jeszcze odświeżyć. Czy masz jakieś propozycje?

Odpowiedz

41

Wewnątrz pozycji Utworzone zdarzenie kontrolki Repeater zarejestrować przycisk z 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

Dziękuję bardzo. To jest praca!!! – user1128331

+0

Dzięki Eugene. Zaoszczędziłem mnóstwo czasu dla mnie. Pozdrawiam –

+0

Potrzebowałem zrobić coś odwrotnego - utwórz przycisk linku we wzmacniaczu, wykonując pełny odświeżenie zamiast asynchronicznego ogłaszania zwrotnego z updatepanelu. To zadziałało idealnie. Zamiast tego użyłem 'scripMan.RegisterPostBackControl (btn)'. – ahwm

11

Dodawanie następujący atrybut do dyrektywy page zawierający repeater i LinkButton będzie również pracować:

<%@ page ClientIDMode="AutoID" %>

miałem kontrolę, że potrzebne do pracy zarówno asynchronicznie i pełne odświeżenie strony, więc za pomocą ScriptManager.RegisterAsyncPostBackControl nie będzie działać dla mnie. Poprzez zamknięcie kontrolki (która zawierała repeater i linkbutton) wewnątrz UpdatePanel, przycisk link spowodowałby asynchroniczny oddzwonienie. Bez aktualizacji, przycisk linku powodowałby pełny zwrot.

Mam nadzieję, że to pomoże komuś innemu.

12

miałem podobny problem, ale nie chcę, aby zaktualizować cały Repeater, tylko zawartość poza repeater ... więc co zrobiłem było

1. Dodaj repeater

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

2. Dodaj panelu aktualizacji z aktualizować treści, a spust

<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

Wielkie dzięki za udostępnienie tego! Dokładnie to, co próbowałem zrobić :-) – Oliver

+0

Wolę ten – Yorro