ASP:Repeater事件 - 如何进行回发

3
我有一个ASP:Repeater,我想在其中显示一组复选框列表。这些复选框与用户偏好清单和用户的答案相关联。请参见下面的代码。
如果可能的话,我想要添加以下操作之一:
选项1:如果任何项目更改,使用 Repeater:OnItemCommand(...) 中的事件将非常好。在我看来,如果列表中有 Button | LinkButton | ImageButton 项,则此事件只会触发一次。例如,如果我放置了一个具有 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
这是我想到的方案,基本上与你的第二个选项相同。在重复器的ItemTemplate中,我使用一个Literal控件(Visible设置为false),其中包含您希望传递给CheckedChanged函数的参数。使用控件的原因是控件将在post back后保留其ViewState中的值,而Repeater的原始数据源将丢失。
在OnItemCreated函数中,我绑定了所有复选框的CheckChanged函数以传递正确的参数。这是我的完整示例。在此示例中,我想将我的数据的Id属性传递给CheckChanged函数。
标记:
<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);
}

希望这可以帮助您。

2
谢谢,谢谢。感谢你一千次。我已经尝试解决这个问题两天了。你真的为这个答案付出了很多努力,我希望我可以投多于一次的赞。;) - Kieran
2
没问题:)。我得说,有时候 asp.net 控件真的不容易使用。 - wsanville

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接