我认为这是我几年没有使用Dome WebForms开发人员时造成的“沉迷”时刻。

我有一个包含一堆复选框的转发器:

<asp:Repeater EnableViewState="true" ID="IDTypesRepeater" runat="server" OnItemDataBound="IdTypesRepeaterItemDataBound">
                        <HeaderTemplate/>
                        <ItemTemplate>
                            <asp:CheckBox EnableViewState="true" ID="chkIdType" Text="<%# ((KeyValuePair<string,int>)Container.DataItem).Key %>" runat="server" />
                            <asp:HiddenField ID="idType" Value="<%# ((KeyValuePair<string,int>)Container.DataItem).Value %>" runat="server"/>
                            <br />
                        </ItemTemplate>
                        </asp:Repeater>

我需要获取在后面的代码中选中的复选框:
 foreach (RepeaterItem repeaterItem in IDTypesRepeater.Items)
        {
            if ( ((CheckBox)repeaterItem.FindControl("chkIdType")).Checked )
            {
                // Do something
            }
        }

但是在回发时,此代码不起作用!我知道总是对中继器进行数据绑定(bind),所以我做到了:
protected void Page_Load(object sender, EventArgs e)
{
    IDTypesRepeater.DataSource = DocTemplateHelper.GetApplicableIDTypes().Where(type => type.Value != 0);
    IDTypesRepeater.DataBind();
}

因此,这会重新填充中继器,但更新代码永远不会找到任何选中的复选框。

最佳答案

绑定(bind)到Page_Init事件

protected void Page_Init(object sender, EventArgs e)
{
    IDTypesRepeater.DataSource = DocTemplateHelper.GetApplicableIDTypes().Where(type => type.Value != 0);
    IDTypesRepeater.DataBind();
}

09-19 19:59