У меня есть собственный servercontrol, который наследуется от 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 имеет значение 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 = new ItemData (e.Current as OrderItem); Когда иерархия элементов управления перестраивается до запуска события, e.Current равен нулю, поэтому, когда попытаться выяснить, какой элемент был помечен для удаления, я получаю 0, поскольку исходное значение было перезаписано.
Есть предложения, как это исправить?