【问题标题】:Getting repeater item checkbox values when calling command from footer从页脚调用命令时获取中继器项目复选框值
【发布时间】:2013-07-02 07:55:18
【问题描述】:

具有以下带有复选框列表的中继器控件:

<asp:Repeater ID="rptItemList" runat="server">
<HeaderTemplate>
</HeaderTemplate>
<ItemTemplate>
    <div>
        <asp:CheckBox ID="chkItem" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ItemName").ToString() %>' />
        <asp:HiddenField ID="hdItem" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "ItemId").ToString() %>' />
    </div>
</ItemTemplate>
<FooterTemplate>
    <asp:LinkButton ID="lbtnDel" runat="server" Text="Delete" OnClick="lbtnDel_Click" OnClientClick="return confirm('Are you sure you want to delete selected items from this list?')"></asp:LinkButton>
</FooterTemplate>
</asp:Repeater>

并遵循后面的代码来处理 lbtnDel_Click 事件:

    protected void lbtnDel_Click(object sender, EventArgs e)
    {
        foreach (RepeaterItem ri in rptItemList.Items)
        {
            CheckBox chk = (CheckBox)ri.FindControl("chkItem");
            HiddenField hd = (HiddenField)ri.FindControl("hdItem");

            if (chk.Checked)
            {
                var tc = new ItemController();
                tc.DeleteItem(Convert.ToInt32(hd.Value));
            }
        }
        Response.Redirect(DotNetNuke.Common.Globals.NavigateURL());
    }

当我选择一个复选框并单击删除时,代码会找到该复选框但将其读取为未选中,因此不会删除该项目。

有什么想法吗?

【问题讨论】:

  • +1 表示很棒。我没有想过在转发器中使用隐藏字段来存储值。如果我可以投票更多,我会的。

标签: c# asp.net repeater


【解决方案1】:

不是 100% 确定,但是您是否在每次页面加载时都进行数据绑定?尝试仅在 !IsPostBack 上绑定 每当我遇到这样的问题时,通常是因为页面加载导致转发器重新绑定并杀死所有当前状态

【讨论】:

  • 大声笑,男生错误。是的,数据绑定正在页面加载中执行并终止状态。谢谢
【解决方案2】:

我在更新面板中有一个中继器。因此,RepeaterItem 中的唯一控件是 DataBoundLiteralControl

这对我有用:

foreach (RepeaterItem item in rpLists.Items)
                {

                    if (item.Controls.Count > 0)
                    {
                        DataBoundLiteralControl dbLt = item.Controls[0] as DataBoundLiteralControl;
                        if (dbLt != null)
                        {
                            var controlCollection = this.ParseControl(dbLt.Text);
                            HtmlInputCheckBox cbInclude = (HtmlInputCheckBox) FindControl(controlCollection, "cbIncludeList");
                            if (cbInclude != null)
                            {
                                if (cbInclude.Checked)
                                {
                                    //your code here 
                                }
                            }
                        }
                    }
                }

我必须为 FindControl 创建一个递归方法,如果它不是页面的一部分,它就无法工作。 耸耸肩 看这里ASP.Net FindControl is not working - How come?

private Control FindControl(Control parent, string id)
        {
            if (parent.ID == id)
                return parent;

            if (parent.HasControls())
            {
                foreach (Control childControl in parent.Controls)
                {

                    if (childControl.ID == id)
                        return childControl;

                    if (childControl.HasControls())
                        return FindControl(childControl, id);
                }

            }

            return null;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2011-06-04
    • 2021-11-09
    • 2016-02-06
    相关资源
    最近更新 更多