Repeater 或 DataList 中的复选框 OnClick/ItemCommand

Posted

技术标签:

【中文标题】Repeater 或 DataList 中的复选框 OnClick/ItemCommand【英文标题】:Checkbox OnClick/ItemCommand in Repeater or DataList 【发布时间】:2011-04-03 18:40:01 【问题描述】:

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

有人知道该怎么做吗?

在我看来你不能触发项目命令,如果你使用 CheckBoxes OnClick 你不能得到中继器行。

【问题讨论】:

这是一个答案:frankwisniewski.net/2013/01/15/… 【参考方案1】:

这是我过去做过类似事情的快速模型。

    <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 这取决于您要如何处理数据。如果是对单行进行简单的数据库标志更新,那么通过 JQuery 连接的 AJAX 回调将是一种更好、更简洁的方法。事实上,无论您对数据做什么,它都可能是一种更简洁的方法。它将允许用户更改多个复选框而无需回发。 这就是我最终所做的。谢谢你的模型。它清楚地说明了它是多么的复杂,并引导我朝 JQuery 方向发展。 =D【参考方案2】:

试试这个代码隐藏:

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

        

【讨论】:

【参考方案3】:

您可以使用 OnClick 事件循环遍历转发器中的每个项目,并检查每个复选框的值 (IsChecked == true)。

请确保您没有在中继器上调用“DataBind()”,否则可能会导致问题。

【讨论】:

如果我想要 OnChange 功能,我必须记录当前状态吗?难道就没有别的办法了吗? 当前状态记录在每个复选框的属性中,所以除了循环遍历每个复选框之外,您不需要做任何额外的事情。

以上是关于Repeater 或 DataList 中的复选框 OnClick/ItemCommand的主要内容,如果未能解决你的问题,请参考以下文章

数据控件GridView、DataList和Repeater都能实现数据表中多行数据的显示

Jquery Ajax 如何实现动态加载Repeater 或者 DataList

gridview ,repeater,datalist有啥区别

Repeater导航菜单DataList产品展示

为 asp.net 的 DataList/Repeater 实现寻呼机

GridView,DataList,Repeater 分别指啥.各有啥特点?