c# - ASP :repeater events - how to postback

标签 c# asp.net events

我有一个 ASP:Repeater,我想在其中显示一个复选框列表。这些复选框与用户首选项列表和用户得到的答案相关。请参阅下面的代码。

如果可能,我想添加执行以下操作之一

选项 1:如果我可以使用 Repeater:OnItemCommand(...) 中的事件在任何项目发生变化时触发,那就太好了。在我看来,这个事件只有在有 Button | 时才会触发。链接按钮 |列表中的 ImageButton 项目。如果我用 AutopostBack="True"放入复选框,IE 将不会触发

选项 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>

提前致谢

最佳答案

这是我想出的,基本上是您的选项#2。 在转发器的 ItemTemplate 中,我使用了一个 Literal 控件(Visible 设置为 false),它具有您希望传递给 CheckedChanged 函数的参数。使用控件的原因是因为控件将在回发后保留其在 ViewState 中的值,而 Repeater 的原始数据源将丢失。

OnItemCreated 函数中,我为所有复选框绑定(bind)了 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);
}

希望对您有所帮助。

关于c# - ASP :repeater events - how to postback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2451348/

相关文章:

c# - 正则表达式和 & 符号的问题

c++ - 用于进程/任务调度的简单离散事件模拟库(C++)?

java - 我是否应该设计一个包含领域事件的会计系统?

c# - Azure 云服务 OnStop

c# - 无法连接到任何指定的 MySql 主机远程数据库

c# - Image.Save(..) 抛出 GDI+ 异常

c# - ASP.NET 5 (vNext) 在 Azure 上导致 500 - 内部服务器错误

c# - 选择使用 .Net 4

asp.net - 在网站中获取 *.aspx 的代码

.net - 了解 AddHandler 并传递委托(delegate)和事件