[英]Retrieving dynamic asp.net checkbox controls - controls are added to page in repeater, but can't retrieve in postback (C#)
我的页面上有一组使用中继器生成的复选框。 复选框适用于我的Web配置中的每个数据库,其想法是使用它们来选择要搜索的数据库。 我让它们由中继器生成,因为我希望我的代码能够动态运行并且可以在任何项目中工作,因此,数据库名称不能被硬编码,并且我没有硬编码的ID。
protected void rptDatabases_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
var databaseName = e.Item.DataItem as string;
CheckBox checkbox = e.Item.FindControl("checkboxDatabase") as CheckBox;
if (checkbox != null)
{
checkbox.Attributes["data-id"] = databaseName;
checkbox.Text = databaseName;
}
}
<div class="databases">
<asp:Repeater runat="server" ID="rptDatabases" OnItemDataBound="rptDatabases_OnItemDataBound">
<ItemTemplate>
<asp:CheckBox runat="server" ID="checkboxDatabase"/>
</ItemTemplate>
</asp:Repeater>
但是,我无法在回发中弄清楚如何从它们中检索所需的数据。 首先,我尝试了这个:
public List<string> GetSelectedDatabases()
{
var selectedDatabases = new List<string>();
foreach (var ctrl in form1.Controls)
{
var checkbox = ctrl as CheckBox;
if (checkbox != null)
{
if (checkbox.Checked)
{
selectedDatabases.Add(checkbox.Text);
}
}
}
return selectedDatabases;
}
但这找不到任何复选框,当我逐步执行时,我发现它根本没有检索任何复选框控件。 所以我改变了它从form1.Controls
到rptDatabases.Controls
得到中继器中的控件。 但是,尽管这会检索所有复选框控件,但会将它们作为RepeaterItem对象返回。 在这行上:
var checkbox = ctrl as CheckBox;
复选框最终为空。 我无法将RepeaterItem转换为CheckBox,也无法访问Text属性,这是我需要找出要添加的值的属性。
我也试过了(var ctrl in rptDatabases.Controls.OfType<CheckBox>())
但是没有返回任何项目。
使用foreach (var ctrl in form1.Controls)
可以获取页面上的所有控件,但是这些复选框位于另一个控件中,因此无法使用。
您需要在RepeaterItem
中循环RepeaterItem
项目,然后找到该项目中的复选框。
foreach (RepeaterItem item in rptDatabases.Items)
{
CheckBox checkbox = item.FindControl("checkboxDatabase") as CheckBox;
if (checkbox != null && checkbox.Checked)
{
selectedDatabases.Add(checkbox.Text);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.