检索动态 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);
    }
}