2010-08-25 18 views
5

Ho bisogno di eseguire una logica lato server su una riga nel mio ripetitore quando si fa clic su un CheckBox all'interno del controllo del ripetitore.Casella di controllo OnClick/ItemCommand in Repeater o DataList

Qualcuno sa come procedere?

Il modo in cui lo vedo non è possibile attivare il comando di articolo e se si utilizzano i CheckBox OnClick non è possibile ottenere la riga ripetitore.

risposta

9

Ecco un rapido esempio di come ho fatto in passato.

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

codebehind:

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

Grazie questo dovrebbe funzionare. Vorrei che ci fosse un modo meno rotondo ... +1 – Jason

+0

Dipende da cosa stai cercando di fare con i dati. Se si tratta di un semplice aggiornamento del flag di database per una singola riga, un callback AJAX collegato tramite JQuery sarebbe un approccio migliore e più pulito. In effetti, è probabilmente un approccio più pulito, indipendentemente da ciò che si sta facendo con i dati. Permetterebbe agli utenti di cambiare più checkbox senza postback. –

+0

Questo è quello che ho finito per fare. Grazie per il mockup però. Ha chiaramente dimostrato quanto fosse eccessivamente complicato e mi ha guidato nella direzione di JQuery. = D – Jason

-1

È possibile utilizzare l'evento Su clic per scorrere ogni elemento nella ripetitore, e verificare il valore di ciascuna casella di controllo, (IsChecked == true).

Assicurati di non chiamare "DataBind()" sul ripetitore, altrimenti ciò potrebbe causare problemi.

+0

Quindi dovrò mantenere una registrazione dello stato corrente se voglio la funzionalità di OnChange? Non c'è un altro modo? – Jason

+0

Lo stato corrente è registrato nelle proprietà di ciascuna casella di controllo, quindi non dovresti fare altro extra oltre al solo looping di ogni checkbox. – Brett

2

Prova questa codebehind:

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

     }