我有一个继承自 CompositeDataBoundControl 的自定义服务器控件。我有三个模板:一个页眉模板、一个页脚模板和一个项目模板。项目模板可以包含一个复选框,我用它来决定是否应该删除该项目。
在页脚和/或页眉模板中,我有一个 CommandName 为“DeleteItem”的按钮。单击该按钮时,我在 OnBubbleEvent 中处理事件:
if (cea.CommandName == "DeleteItem") {
//loop through the item list and get the selected rows
List<int> itemsToDelete = new List<int>();
foreach(Control c in this.Controls){
if (c is ItemData) {
ItemData oid = (ItemData)c;
CheckBox chkSel = (CheckBox)oid.FindControl("chkSelected");
if (chkSel.Checked) {
itemsToDelete.Add(oid.Item.Id);
}
}
}
foreach (int id in itemsToDelete) {
DeleteItem(id);
}
}
}
问题是Item为空,因为 CreateChildControls 方法已经运行,因为 asp.net 需要在事件触发之前重新创建控件层次结构。它使用 DummyDataSource 和空对象列表来重新创建控件层次结构:
IEnumerator e = dataSource.GetEnumerator();
if (e != null) {
while (e.MoveNext()) {
ItemData container = new ItemData (e.Current as OrderItem);
ITemplate itemTemplate = this.ItemTemplate;
if (itemTemplate == null) {
itemTemplate = new DefaultItemTemplate();
}
itemTemplate.InstantiateIn(container);
Controls.Add(container);
if (dataBinding) {
container.DataBind();
}
counter++;
}
}
问题在于这一行: ItemData container = new ItemData (e.Current as OrderItem); 在触发事件之前重建控件层次结构时,e.Current 为空,因此当我尝试找出哪个项目被标记为删除时,我得到 0,因为原始值已被覆盖。
对于如何解决这个问题,有任何的建议吗?