Стойност на квадратчето за отметка на ASP.NET при обратна връзка вътре в повторител

Имам ASP Repeater, който съдържа списък с тагове и бих искал да видя кой от маркерите е избран (отметнат).

Като:

<HeaderTemplate>
        <ul class="tags-list">
    </HeaderTemplate>
    <ItemTemplate>
        <asp:CheckBox ID="tag" runat="server" AutoPostBack="true" Text='' />
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

Проблемът, с който се сблъсквам е, че

protected override void InitializeControls(Telerik.Sitefinity.Web.UI.GenericContainer container, Telerik.Sitefinity.Web.UI.ContentUI.Contracts.IContentViewDefinition definition)

методът се задейства преди и:

    void tagList_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
        {
            var item = e.Item.DataItem as Taxon;
            var checkbox = e.Item.FindControl("tag") as CheckBox;
            checkbox.Text = item.Title;
            checkbox.CheckedChanged += new EventHandler(this.checkbox_Changed);

        }
    }

се задейства всеки път преди моя метод за обратно извикване:

protected void checkbox_Changed(object sender, EventArgs e)
{
    CheckBox tagCheckbox = (CheckBox)sender;

    if (tagCheckbox.Checked)
    {

    }
}

Може ли някой да ме насочи коя би била най-добрата практика за получаване на състоянието на квадратчето(ята) за отметка?


person el.severo    schedule 23.05.2013    source източник
comment
tagList_ItemDataBound ще се задейства, ако свържете вашия ретранслатор с данни в page_load без !ispostback   -  person Emre    schedule 25.05.2013
comment
@Emre: Добре, благодаря! Но как да получа състоянието на квадратчето за отметка? Поставянето на условието за обвързване на данни ще направи tagList.Items.Count == 0.   -  person el.severo    schedule 25.05.2013
comment
трябва ли да зададете eventhandler в itemdatabound? защо не използвате OnCheckedChanged="checkbox_Changed" в полето за отметка?   -  person Emre    schedule 25.05.2013
comment
@Emre: Съжалявам, но мисля, че не разбрах какво искаш да кажеш. Обработчикът на събития е зададен програмно в tagList_ItemDataBound   -  person el.severo    schedule 25.05.2013
comment
имам предвид защо не използваш <asp:CheckBox ID="tag" runat="server" AutoPostBack="true" Text='' OnCheckedChanged="checkbox_Changed"/>   -  person Emre    schedule 25.05.2013
comment
@Emre: Защото, ако добавя OnCheckedChanged="checkbox_Changed", ретранслаторът вече не се изобразява.. Не знам защо...   -  person el.severo    schedule 25.05.2013
comment
нека да продължим тази дискусия в чата   -  person el.severo    schedule 25.05.2013


Отговори (2)


бихте ли опитали да дефинирате метода "CheckedChanged" вграден с контролата на квадратчето за отметка вътре в повторителя:

<asp:CheckBox ID="tag" runat="server" AutoPostBack="true" Text='' CheckedChanged="checkbox_Changed" />

Тогава не е нужно да се притеснявате за обвързването на манипулатора в кода отзад. Ако не получавате правилното състояние на квадратчето за отметка, също се уверете, че имате „EnableViewState“ в свойствата на страницата.

Надявам се, че това е полезно, уведомете ме, ако съм разбрал погрешно въпроса

person SelAromDotNet    schedule 31.07.2013

Имам доста мръсно решение. Проблемът ми беше да задействам обратно изпращане на квадратче за отметка в ретранслатор, но имам нужда и от ID на записа. Най-добрият начин за архивиране на ID е използването на атрибут ValidationGroup:

<asp:CheckBox ValidationGroup='<%# DataBinder.Eval(Container.DataItem,"id") %>' ID="YOUR_ID" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox_Changed" />

и в кода отзад:

CheckBox theCheckBox = (CheckBox)sender; 
int id = Convert.ToInt16(theCheckBox.ValidationGroup);

ако някой има същите нужди може да използва това решение.

person user2950363    schedule 21.06.2016