复选框在Repeater或DataList中的OnClick/ItemCommand事件

6

当重复器控件中的复选框被点击时,我需要在重复器中的一行上执行一些服务器端逻辑。

有人知道如何做吗?

我认为你不能触发item command,如果你使用CheckBoxes OnClick,你无法获取重复器行。


这里有一个答案:http://www.frankwisniewski.net/2013/01/15/how-to-make-a-checkbox-fire-the-itemcommand-event-of-a-repeater/ - ModusPwnens
3个回答

9
以下是我过去类似工作的快速模拟。
    <asp:Repeater id="repeater1" runat="server" OnItemDataBound="repeater1_OnItemDataBound" >
        <ItemTemplate>
            <asp:CheckBox ID="chk" runat="server" OnCheckedChanged="Check_Changed" AutoPostBack="true" />
        </ItemTemplate>
    </asp:Repeater>

代码后台:

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

谢谢,这应该可以工作。但希望有更简单的方法... +1 - Jason
这取决于您想如何处理数据。如果只是针对单行进行简单的数据库标志更新,那么通过JQuery连接的AJAX回调将是更好、更清晰的方法。实际上,无论您要做什么,这可能都是一种更清洁的方法。它将允许用户在没有页面刷新的情况下更改多个复选框。 - Daniel Dyson
那就是我最终做的。虽然感谢你的模型,但它清楚地说明了这有多么复杂,并带领我朝向 JQuery 方向。=D - Jason

2

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

        }

-1
您可以使用 OnClick 事件循环遍历Repeater中的每个项,并检查每个复选框的值(IsChecked == true)。
只需确保不在Repeater上调用“DataBind()”,否则可能会出现问题。

那么如果我想要OnChange功能,我就必须保留当前状态的记录?难道没有其他方法吗? - Jason
当前状态记录在每个复选框的属性中,因此除了循环遍历每个复选框之外,您不需要做任何额外的事情。 - Brett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接