CompositeDataBoundControl - 由于DummyDataSource而触发事件之前覆盖的数据绑定值

时间:2010-02-07 01:13:17

标签: c# asp.net servercontrols

我有一个继承自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。

有关如何解决此问题的任何建议吗?

1 个答案:

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