2010-08-25 39 views
5

Necesito hacer algo de lógica del lado del servidor en una fila en mi repetidor cuando se hace clic en una casilla de verificación dentro del control del repetidor.casilla de verificación OnClick/ItemCommand en Repeater o DataList

¿Alguien sabe cómo hacerlo?

De la forma en que lo veo, no se puede disparar el comando del elemento y si usa CheckBoxes OnClick no se puede obtener la fila del repetidor.

Respuesta

9

Aquí hay una maqueta rápida de cómo he hecho algo similar en el pasado.

<asp:Repeater id="repeater1" runat="server" OnItemDataBound="repeater1_OnItemDataBound" > 
     <ItemTemplate> 
      <asp:CheckBox ID="chk" runat="server" OnCheckedChanged="Check_Changed" AutoPostBack="true" /> 
     </ItemTemplate> 
    </asp:Repeater> 

código subyacente:

public class Model { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public partial class Checkboxes : System.Web.UI.Page { 
     protected void Page_Load(object sender, EventArgs e) { 
      if(!IsPostBack) { 
       repeater1.DataSource = new List<Model> { 
           new Model { Id = 1, Name = "a" }, 
           new Model { Id = 2, Name = "b" }, 
           new Model { Id = 3, Name = "c" } }; 
       repeater1.DataBind(); 
      } 
     } 

     protected void repeater1_OnItemDataBound(Object sender, RepeaterItemEventArgs e) { 
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { 
       var item = e.Item.DataItem as Model; 
       if (item != null) { 
        var chk = e.Item.FindControl("chk") as CheckBox; 
        if (chk != null) { 
         chk.Text = item.Name; 
         chk.InputAttributes.Add("value", item.Id.ToString()); 
        } 
       } 
      } 
     } 

     protected void Check_Changed(Object sender, EventArgs e) { 
      var id = ((CheckBox) sender).InputAttributes["value"]; 
      //you now have access to the item id and can manipulate at will. 
     } 
    } 
+0

Gracias esto debería funcionar. Ojalá hubiera un camino menos redondo ... +1 – Jason

+0

Depende de lo que intentes hacer con los datos. Si se trata de una actualización de indicador de base de datos simple para una sola fila, una devolución de llamada AJAX conectada a través de JQuery sería un enfoque mejor y más limpio. De hecho, es probable que sea un enfoque más limpio, sin importar lo que esté haciendo con los datos. Permitiría a los usuarios cambiar varias casillas de verificación sin devoluciones. –

+0

Eso es lo que terminé haciendo. Gracias por la maqueta sin embargo. Esto ilustró claramente lo excesivamente complicado que era y me guió en la dirección de JQuery. = D – Jason

-1

Se podría utilizar el evento OnClick de bucle a través de cada elemento en el repetidor, y compruebe el valor de cada casilla, (IsChecked == true).

Simplemente asegúrese de que no está llamando a un "DataBind()" en el repetidor, de lo contrario podría causar problemas.

+0

Entonces, ¿tendré que mantener un registro del estado actual si quiero la funcionalidad OnChange? ¿No hay otra manera? – Jason

+0

El estado actual se registra en las propiedades de cada casilla de verificación, por lo que no debería tener que hacer nada más además de simplemente recorrer cada casilla de verificación. – Brett

2

probar este código subyacente:

protected void Checked_Changed(object sender, EventArgs e) 
     { 
      var item = ((CheckBox)sender).Parent as RepeaterItem; 
// now you have the repeater row. You can travers further up the controls if you use Parent.Parent... 

     } 
Cuestiones relacionadas