2012-01-03 38 views
13

En mi página, tengo un repetidor dentro de LinkButton, pero UpdatePanel no puede encontrar el LinkButton en AsyncPostBackTrigger.Cómo hacer AsyncPostBackTrigger para LinkButton en el repetidor

Aquí es 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> 

Aquí es 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"); 
    } 

Probé muchos métodos, pero la página todavía está en Actualizar. ¿Tienes alguna sugerencia?

Respuesta

41

Elemento interiorCreated event del control Repeater registra el botón 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

Gracias mucho. ¡¡¡Es trabajo!!! – user1128331

+0

Gracias Eugene. Ahorré mucho tiempo para mi. Cheers –

+0

Necesitaba hacer lo contrario: hacer un botón de enlace en un repetidor hacer una devolución de datos completa en lugar de una devolución de datos asincrónica desde el panel de actualización. Esto funcionó perfectamente para eso. Acabo de usar 'scripMan.RegisterPostBackControl (btn)' en su lugar. – ahwm

11

añadiendo el siguiente atributo a la directiva de página que contiene el repetidor y LinkButton también funcionará:

<%@ page ClientIDMode="AutoID" %>

que tenían un control que necesita para trabajar tanto la devolución de datos de forma asíncrona y lleno, por lo que el uso de la ScriptManager.RegisterAsyncPostBackControl no funcionaría para mí. Al encerrar el control (que contenía un repetidor y un botón de enlace) dentro de un UpdatePanel, el botón link generaría una devolución de datos asincrónica. Sin un panel de actualización, el botón de enlace provocaría una publicación completa.

Espero que esto ayude a alguien más.

12

tuve un problema similar, pero que no quería poner al día todo el repetidor, solamente un contenido fuera del repetidor ... así que lo que hice fue

1. Añadir el repetidor

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

2. Añadir el panel de actualización con el contenido actualizable, y el gatillo

<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

¡Muchas gracias por compartir esto! Exactamente lo que estaba tratando de hacer :-) – Oliver

+0

Prefiero este – Yorro

Cuestiones relacionadas