2012-01-03 10 views
13

Nella mia pagina, ho un LinkButton all'interno del ripetitore, ma UpdatePanel non riesce a trovare il LinkButton su AsyncPostBackTrigger.Come eseguire AsyncPostBackTrigger per il LinkButton nel ripetitore

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

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

ho provato molti metodi, ma la pagina è ancora Aggiorna. Hai qualche suggerimento?

risposta

41

All'interno dell'evento ItemCreated del controllo Repeater registrare il pulsante con 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

Grazie molto. È un lavoro !!! – user1128331

+0

Grazie Eugenio. Ho risparmiato molto tempo per me. Cheers –

+0

Avevo bisogno di fare l'opposto di questo - fare un pulsante di collegamento in un ripetitore fare un postback completo invece di un postback asincrono all'interno dell'aggiornamento. Questo ha funzionato perfettamente per questo. Ho usato invece 'scripMan.RegisterPostBackControl (btn)'. – ahwm

11

aggiungendo la seguente attributo alla direttiva pagina, contenente la ripetitore e LinkButton sarà anche lavorare:

<%@ page ClientIDMode="AutoID" %>

ho avuto un controllo che aveva bisogno di lavorare sia postback asincrono e pieno, in modo da utilizzare il ScriptManager.RegisterAsyncPostBackControl non funzionerebbe per me. Includendo il controllo (che conteneva un ripetitore e un pulsante di collegamento) all'interno di un UpdatePanel, il pulsante link causava un postback asincrono. Senza alcun aggiornamento, il pulsante link causerebbe un postback completo.

Spero che questo aiuti qualcun altro.

12

ho avuto problema simile, ma non ho voglia di aggiornare l'intero ripetitore, solo un contenuto al di fuori del ripetitore ... così quello che ho fatto è stato

1. Aggiungere il ripetitore

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

2. Aggiungere il pannello di aggiornamento con il contenuto aggiornabile, e il grilletto

<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

Grazie mille per aver condiviso questo! Esattamente quello che stavo cercando di fare :-) – Oliver

+0

Preferisco questo – Yorro