CompositeDataBoundControl - значения базы данных, перезаписываемые до запуска события, из-за DummyDataSource - PullRequest
1 голос
/ 07 февраля 2010

У меня есть собственный 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, поскольку исходное значение было перезаписано.

Есть предложения, как это исправить?

1 Ответ

0 голосов
/ 07 февраля 2010

Я наконец нашел решение, которое работает.Проблема заключается в том, что связанные данные подключаются к элементу управления только тогда, когда они связаны, и непосредственно после них (обычно к ним обращается событие ItemDataBound).

Таким образом, чтобы решить эту проблему, мне пришлось добавить скрытый литерал, содержащий идентификатор элемента данных, в элемент управления контейнера.В OnBubbleEvent я нахожу скрытый литерал и получаю идентификатор:

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));
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...