這裏是我想出了,這基本上是你的選擇#2。 在轉發器的ItemTemplate
中,我使用一個Literal控件(可見設置爲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>
後面的代碼:
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 2010-03-16 04:31:40
沒問題:)。我得說,有時候asp.net控件並不容易處理。 – wsanville 2010-03-16 11:47:16