views:

23

answers:

2

I need to do some server side logic on a row in my repeater when a CheckBox is clicked inside the repeater control.

Anyone know how to go about this?

The way I see it you cant fire item command and if you use the CheckBoxes OnClick you cant get the repeater row.

+2  A: 

Here is a quick mock-up of how I have done similar in the past.

    <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.
        }
    }
Daniel Dyson
Thanks this should work. Wish there was a less round about way... +1
Blankasaurus
It depends on what you are trying to do with the data. If it is a simple database flag update for a single row, an AJAX callback hooked up through JQuery would be a better and cleaner approach. In fact, it is probably a cleaner approach, no matter what you are doing with the data. It would allow users to change multiple checkboxes without postbacks.
Daniel Dyson
That's what I ended up doing. Thanks for the mockup though. It clearly illustrated how overly complicated it was and steered me in the JQuery direction. =D
Blankasaurus
+1  A: 

You could use the OnClick event to loop through each item in the repeater, and check the value of each checkbox, (IsChecked == true).

Just make sure that you are not calling a "DataBind()" on the repeater, otherwise that might cause issues.

Brett
So I will have to keep a record of the current state if I want OnChange functionality? Is there not another way?
Blankasaurus
The current state is recorded in the properties of each checkbox, so you shouldn't have to do anything extra besides just loop through each checkbox.
Brett