Почему мой контроль репитера пуст при обратной передаче? - PullRequest
2 голосов
/ 05 декабря 2011

Я думаю, что это "дохлый" момент, вызванный тем, что у меня в течение нескольких лет не было разработчика 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
            }
        }

Но при обратной передаче этот код не работает!Я знаю, что всегда следует привязывать данные к повторителю, поэтому я сделал это:

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

Таким образом, это заново заполняет повторитель, но код обновления никогда не находит никаких отмеченных флажков. Есть идеи?

Ответы [ 3 ]

5 голосов
/ 05 декабря 2011

Bind в событии Page_Init

protected void Page_Init(object sender, EventArgs e)
{
    IDTypesRepeater.DataSource = DocTemplateHelper.GetApplicableIDTypes().Where(type => type.Value != 0);
    IDTypesRepeater.DataBind();
}
3 голосов
/ 05 декабря 2011

Обязательно используйте метод !Page.IsPostBack в вашей загрузке страницы.В противном случае повторитель продолжит сбрасываться, и все ваши флажки будут находиться там по умолчанию (не проверено)

0 голосов
/ 05 декабря 2011

Это должно это исправить. Вы связываете контроль при обратной передаче, следовательно, теряете значения. Вы можете связать его после обработки любого события, чтобы показать обновленную запись.

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