获取转发器中复选框的值

时间:2019-07-10 13:43:03

标签: c# asp.net

我在另一个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);
        }
    }

我不知道如何获得该值,或者如果没有其他更简单的方法而不添加列表,我认为它会更好

1 个答案:

答案 0 :(得分:0)

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

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

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