CompositeDataBoundControl から継承するカスタム サーバー コントロールがあります。ヘッダー テンプレート、フッター テンプレート、アイテム テンプレートの 3 つのテンプレートがあります。項目テンプレートには、項目を削除するかどうかを決定するために使用するチェックボックスを含めることができます。
フッターおよび/またはヘッダー テンプレートには、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);
}
}
}
問題は、イベントが発生する前にasp.netがコントロール階層を再作成する必要があるため、CreateChildControlsメソッドがすでに実行されているため、Itemがnullであることです。DummyDataSource と null オブジェクトのリストを使用して、コントロール階層を再作成します。
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 が返されます。
これを修正する方法について何か提案はありますか?