asp: репитер события - как сделать обратную передачу - PullRequest
3 голосов
/ 16 марта 2010

У меня есть ASP:Repeater, в котором я хотел бы отобразить список флажков. Эти флажки связаны со списком пользовательских настроек и полученным ответом пользователей. См. Код Bellow.

Я бы хотел добавить одно из следующих действий, если это возможно

Вариант 1 : Было бы здорово, если бы я мог использовать Событие в Repeater:OnItemCommand(...), чтобы выстрелить, если какой-либо из предметов изменится. Мне кажется, что это событие сработает только при наличии кнопки | LinkButton | Элемент ImageButton в списке. IE не сработает, если я поставлю галочку с AutopostBack = "True"

Вариант 2 : есть ли способ, которым я мог бы присоединить метод к событию CheckBox: CheckChanged Мне нужно было бы передать этому методу параметр, сообщающий, какой комбо вопрос / ответ изменить.

Вариант 3 : Ваш ответ, если вы знаете более простой способ, который был бы потрясающим.

Код :

<asp:Repeater ID="RPTprefs" runat="server" DataSourceID="getAnswers"    OnItemCommand="RPTprefs_ItemCommand">
      <ItemTemplate>
         <li><asp:CheckBox ID='questionID' runat="server" 
        Checked='<%# Eval("pr.up_is_selected") %>' 
        Text='<%# Eval("prp.prefs_question") %>' 
        AutoPostBack="true"
        OnCheckedChanged="CheckChanged"  /></li>
                </ItemTemplate>
               </asp:Repeater>

Заранее спасибо

1 Ответ

5 голосов
/ 16 марта 2010

Вот то, что я придумал, и это в основном ваш вариант №2. В ItemTemplate репитера я использую элемент управления Literal (Visible установлен в false), который имеет аргумент, который вы хотите передать функции CheckedChanged. Причина использования элемента управления заключается в том, что элемент управления сохранит свое значение в ViewState после обратной отправки, тогда как исходный источник данных для повторителя будет потерян.

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

Markup:

<asp:Repeater ID="Repeater1" runat="server" OnItemCreated="ItemCreated">
       <ItemTemplate>
           <asp:Literal ID="litArg" runat="server" Visible="false" Text='<%# Eval("Id") %>'>
           </asp:Literal><%# Eval("Name") %>
           <asp:CheckBox ID="chkCool" runat="server" AutoPostBack="true" Checked='<%# Eval("IsCool") %>' /><br />
       </ItemTemplate>
</asp:Repeater>

Код:

public class SomeClass
{
    public SomeClass(bool c, string n, int id)
    {
        IsCool = c;
        Name = n;
        Id = id;
    }
    public bool IsCool { get; set; }
    public string Name { get; set; }
    public int Id { get; set; }
}
.
.
.

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        List<SomeClass> people = new List<SomeClass>();

        people.Add(new SomeClass(true, "Will", 666));
        people.Add(new SomeClass(true, "Dan", 2));
        people.Add(new SomeClass(true, "Lea", 4));
        people.Add(new SomeClass(false, "Someone", 123));

        Repeater1.DataSource = people;
        Repeater1.DataBind();
    }
}

private void CheckChanged(int id)
{
    Response.Write("CheckChanged called for item #" + id.ToString());
}

protected void ItemCreated(object sender, RepeaterItemEventArgs e)
{
    //this needs to be set again on post back
    CheckBox chk = (CheckBox)e.Item.FindControl("chkCool");
    Literal arg = (Literal)e.Item.FindControl("litArg");

    Action<object, EventArgs> handler = (s, args) => CheckChanged(Convert.ToInt32(arg.Text));
    chk.CheckedChanged += new EventHandler(handler);
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...