asp:转发器事件 - 如何回发

Kie*_*ran 3 c# asp.net events

我有一个ASP:Repeater我要显示的复选框列表.这些复选框与用户首选项列表和用户得到的答案相关.参见Code Bellow.

如果可能的话,我想添加以下其中一项

选项1:Repeater:OnItemCommand(...)如果任何项目发生变化,我可以使用事件来激发它.在我看来,如果有一个Button |,这个事件只会触发 LinkBut​​ton | 列表中的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>
Run Code Online (Sandbox Code Playgroud)

提前致谢

wsa*_*lle 5

这是我想出的,基本上是你的选择#2.在ItemTemplate转发器中,我使用Literal控件(Visible设置为false),它具有您希望传递给CheckedChanged函数的参数.使用控件的原因是因为控件将在回发后在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>
Run Code Online (Sandbox Code Playgroud)

代码背后:

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);
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 谢谢谢谢。一千次谢谢你。我一直试图解决这个问题 2 天。你真的为这个答案付出了一些努力,我希望我能不止一次投票。;) (2认同)
  • 没问题 :).我得说,有时asp.net控件不容易使用. (2认同)