2010-08-25 8 views
5

Ich muss einige serverseitige Logik in einer Reihe in meinem Repeater tun, wenn eine CheckBox im Repeater-Steuerelement geklickt wird.Kontrollkästchen OnClick/ItemCommand in Repeater oder DataList

Wer weiß, wie man das macht?

Die Art, wie ich es sehe, können Sie Element Befehl auslösen und wenn Sie die CheckBoxen OnClick verwenden, können Sie nicht die Repeater Zeile.

Antwort

9

Hier ist ein kurzes Modell, wie ich in der Vergangenheit ähnlich gemacht habe.

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

Code-Behind:

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

Dank dieser Arbeit sollte. Wünschte, es gäbe einen weniger runden Weg ... +1 – Jason

+0

Es hängt davon ab, was Sie mit den Daten zu tun versuchen. Wenn es sich um ein einfaches Datenbank-Flag-Update für eine einzelne Zeile handelt, wäre ein AJAX-Rückruf, der über JQuery angeschlossen wird, ein besserer und saubererer Ansatz. In der Tat ist es wahrscheinlich ein sauberer Ansatz, egal was Sie mit den Daten tun. Es würde Benutzern erlauben, mehrere Checkboxen ohne Postbacks zu ändern. –

+0

Das habe ich getan. Danke für das Modell. Es zeigte deutlich, wie übermäßig kompliziert es war und steuerte mich in der JQuery-Richtung. = D – Jason

-1

Sie das Ereignis OnClick eine Schleife durch jedes Element im Repeater, und prüfen Sie den Wert jeder Checkbox verwenden könnte, (IsChecked == true).

Stellen Sie sicher, dass Sie keinen "DataBind()" auf dem Repeater aufrufen, da dies sonst Probleme verursachen könnte.

+0

Also muss ich den aktuellen Zustand notieren, wenn ich die OnChange-Funktion möchte? Gibt es keinen anderen Weg? – Jason

+0

Der aktuelle Status wird in den Eigenschaften jedes Kontrollkästchens aufgezeichnet. Sie sollten also nichts weiter tun, als jedes Kontrollkästchen einzeln durchlaufen zu lassen. – Brett

2

Versuchen Sie, diese Code-Behind:

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

     }