首页 > 解决方案 > 获取中继器中复选框的值

问题描述

我有一个repeater内在的另一个repeater,第二个我有一个列表,checkbox我需要获取检查的值。

这是我的前面代码:

<asp:Repeater runat="server" ID="rptPerfis" OnItemDataBound="ItemBound">
    <ItemTemplate>
        <div class="mws-form-row">
            <ul class="mws-form-list inline" style="float: none; display: inline;">
                <li style="padding-top: 10px;">
                    <%# rptNome(Container) %></li>
            </ul>
            <asp:Repeater runat="server" ID="rptUsers">
                <ItemTemplate>
                    <div class="mws-form-item radioPermissoes clearfix" style="float: none;">
                        <ul class="mws-form-list inline">
                            <li>
                                <asp:CheckBox runat="server" Text="<%# rptAdministradorNome(Container) %>" ID="checkUser" CssClass="<%# rptAdministradorPostClass(Container) %>" /></li>
                        </ul>
                    </div>
                </ItemTemplate>
            </asp:Repeater>
        </div>
        <br />
        <hr />
    </ItemTemplate>
</asp:Repeater>

<asp:LinkButton runat="server" ID="fLnkSalvar" class="mws-ic-16 ic-disk" OnClick="fLnkSalvar_Click">Salvar</asp:LinkButton>

这就是我填充这个中继器的方式:

protected void Page_Load(object sender, EventArgs e)
{
    listaAdm = Servicos.AdministradorMySql.ListarEmpresa(denuncia.Empresa).OrderByDescending(x => x.Nome).ToList();
    todosPerfis = Servicos.Perfil.ListarTodos().ToList();
    rptPerfis.DataSource = todosPerfis.Where(x => x.Ativo).OrderBy(x => x.Nome);
    rptPerfis.DataBind();

}

protected void ItemBound(object sender, RepeaterItemEventArgs args)
{
    if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem)
    {

        int idPerfil = ((Perfil)args.Item.DataItem).ID;
        Repeater childRepeater = (Repeater)args.Item.FindControl("rptUsers");
        childRepeater.DataSource = listaAdm.Where(x => x.Perfil > 1 && x.Perfil == idPerfil).ToList();
        childRepeater.DataBind();
    }
}

    protected void fLnkSalvar_Click(object sender, EventArgs e)
    {
        Administrador usuario = new Administrador();
        usuario.Permissoes = new List<string>();

        // i need to get this values here to fill this `List<string>` and then save

        foreach (var x in usuario.Permissoes)
        {
            Servicos.Denuncia.InserirUsuarios(denuncia.ID, x);
        }
    }

我不知道如何获得这些值,或者是否有另一种更简单的方法而不添加到列表中,我认为它更好

标签: c#asp.net

解决方案


您必须在多个级别上使用 FindControl。首先在父Repeater中找到正确的Item,然后在子Repeater的正确Item中找到CheckBox。

var cb = ((Repeater)rptPerfis.Items[i].FindControl("rptUsers")).Items[j].FindControl("checkUser") as CheckBox;

PS,您需要将代码包装在Page_Load检查中,IsPostBack否则您将永远无法在 PostBack 中检索正确的复选框状态。


推荐阅读