我有一个继承自CompositeDataBoundControl的自定义servercontrol。我有三个模板:一个标题模板,一个页脚模板和一个项目模板。项目模板可以包含一个复选框,我用它来决定是否应该删除该项目。
在页脚和/或页眉模板中,我有一个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 为null,因为已经运行了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为null,所以当我试图找出哪个项目被标记为删除,因为原始值被覆盖,我得到0。
有关如何解决此问题的任何建议吗?
答案 0 :(得分:0)
我终于找到了一个有效的解决方案。问题是绑定数据仅在绑定时和之后直接连接到控件(通常在ItemDataBound事件中访问)。
因此,为了解决这个问题,我必须将包含数据项id的隐藏文字添加到容器控件中。在OnBubbleEvent中,我找到隐藏的文字并获取id:
ItemData oid = (ItemData)c;
CheckBox chkSel = (CheckBox)oid.FindControl("chkSelected");
if(chkSel != null) {
if(chkSel.Checked) {
Literal litId = (Literal)oid.FindControl("litId");
itemsToDelete.Add(Utils.GetIntegerOnly(litId.Text));
}
}