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

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

有人知道该怎么做吗?

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

【问题讨论】:

标签: c# asp.net repeater datalist


【解决方案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 功能,我必须记录当前状态吗?难道就没有别的办法了吗?
    • 当前状态记录在每个复选框的属性中,所以除了循环遍历每个复选框之外,您不需要做任何额外的事情。
    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多