c# - 获取中继器中复选框的值
问题描述
我有一个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);
}
}
我不知道如何获得这些值,或者是否有另一种更简单的方法而不添加到列表中,我认为它更好
解决方案
您必须在多个级别上使用 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 中检索正确的复选框状态。
推荐阅读
- javascript - 为什么 mapStateToDispatch 没有发送正确的值
- laravel - Laravel 向推送者广播消息
- javascript - 在数据表中启用编辑/删除
- r - 使用函数用 sd 估算异常值
- java - 当应用程序未在 Android 设备中运行时,如何在特定时间发送通知?
- .net - .net 核心中的快速进程间事件
- c++ - 在 C++ 中将字符串转换为句子大小写
- javascript - Laravel 分页方法仅从数据库中获取特定的行数,而不是获取所有数据
- python - Data cleaning while Web-scraping using Beautiful soup
- typescript - 如何拒绝 TypeScript 中具有未知类型的不兼容函数参数