我有一个 ASP:Repeater
,我想在其中显示一个复选框列表。这些复选框与用户首选项列表和用户生成的答案相关。请参阅下面的代码。
如果可能,我想添加执行以下操作之一
选项 1 :如果我可以使用 Repeater:OnItemCommand(...)
中的事件在任何项目发生更改时触发,那就太好了。在我看来,这个事件只会在有 Button | 时触发。链接按钮 |列表中的 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>
提前致谢
最佳答案
这是我想出的,这基本上是您的选项#2。
在转发器的 ItemTemplate
中,我使用了一个文字控件(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/