代码之家  ›  专栏  ›  技术社区  ›  Kieran

asp:重复事件-如何回发

  •  3
  • Kieran  · 技术社区  · 16 年前

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

    如果可能的话,我想补充一下

    方案1 Repeater:OnItemCommand(...)

    方案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 回复  |  直到 16 年前
        1
  •  5
  •   wsanville    16 年前

    这是我的想法,基本上是你的选择2。 ItemTemplate 对于中继器,我使用一个文本控件(Visible设置为false),其中包含您希望传递给 CheckedChanged 功能。使用控件的原因是,在回发后,控件将在ViewState中保留其值,而中继器的原始数据源将丢失。

    OnItemCreated CheckChanged 函数用于所有复选框传入正确的参数。这是我完整的例子。在这种情况下,我想通过考试 Id 将我的数据的属性 功能。

    <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);
    }
    

    希望有帮助。

    推荐文章