检索动态 asp.net 复选框控件 - 控件已添加到转发器中的页面,但无法在回发中检索 (C#)
Retrieving dynamic asp.net checkbox controls - controls are added to page in repeater, but can't retrieve in postback (C#)
我的页面上有一组复选框是使用转发器生成的。复选框用于我的网络配置中的每个数据库,我的想法是使用它们来 select 要搜索的数据库。我让它们由中继器生成,因为我希望我的代码是动态的并且可以在任何项目中工作 - 因此,数据库名称不能硬编码,而且我没有硬编码 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 转换为复选框,也无法访问文本 属性,我需要它来确定要添加的值。
我也试过 (var ctrl in rptDatabases.Controls.OfType<CheckBox>())
但是 returns 没有项目。
使用 foreach (var ctrl in form1.Controls)
,您将获得页面上的所有控件,但这些复选框位于另一个控件中,因此无法使用。
您需要在 Repeater 中循环 RepeaterItem
项目并找到该项目中的复选框。
foreach (RepeaterItem item in rptDatabases.Items)
{
CheckBox checkbox = item.FindControl("checkboxDatabase") as CheckBox;
if (checkbox != null && checkbox.Checked)
{
selectedDatabases.Add(checkbox.Text);
}
}
我的页面上有一组复选框是使用转发器生成的。复选框用于我的网络配置中的每个数据库,我的想法是使用它们来 select 要搜索的数据库。我让它们由中继器生成,因为我希望我的代码是动态的并且可以在任何项目中工作 - 因此,数据库名称不能硬编码,而且我没有硬编码 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 转换为复选框,也无法访问文本 属性,我需要它来确定要添加的值。
我也试过 (var ctrl in rptDatabases.Controls.OfType<CheckBox>())
但是 returns 没有项目。
使用 foreach (var ctrl in form1.Controls)
,您将获得页面上的所有控件,但这些复选框位于另一个控件中,因此无法使用。
您需要在 Repeater 中循环 RepeaterItem
项目并找到该项目中的复选框。
foreach (RepeaterItem item in rptDatabases.Items)
{
CheckBox checkbox = item.FindControl("checkboxDatabase") as CheckBox;
if (checkbox != null && checkbox.Checked)
{
selectedDatabases.Add(checkbox.Text);
}
}