2014-10-23 2 views
1

У меня есть usercontrol DmsRegisterPod, который выводится в репитере, который сам находится внутри UpdatePanel. У меня есть событие на DmsRegisterPod называется OnUpdated который я подписавшей в повторители ItemDataBound событий, например:Поднятие события от пользователей и уведомлений подписчиков

protected void rptPendingDmsRequests_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     DealershipIRLink irLink = (DealershipIRLink)e.Item.DataItem; 
     DmsRegisterPod dmsRegisterPod = (DmsRegisterPod)e.Item.FindControl("ucDmsRegisterPod"); 
     dmsRegisterPod.ValidationGroup = string.Format("dms-pod-{0}", e.Item.ItemIndex); 
     dmsRegisterPod.DealershipIRLink = irLink; 
     dmsRegisterPod.OnUpdated += dmsRegisterPod_OnUpdated; 
    } 
} 

private void dmsRegisterPod_OnUpdated(object sender, EventArgs e) 
{ 
    this.DataBind(); 
} 

событие является установка как таковая в UserControl:

public event EventHandler OnUpdated; 

private void Updated(EventArgs e) 
{ 
    if (this.OnUpdated != null) 
    { 
     OnUpdated(this, e); 
    } 
} 

Он поднимается в обработчик Accept нажмите:

protected void btnAccept_Click(object sender, EventArgs e) 
{ 
    if (Page.IsValid) 
    { 
     this.DealershipIRLink.dms_account_number = txtDmsNumber.Text; 

     this.DealershipIRLink.id_dealer_ir_link_status = DealerIRLinkStatus.DealerIRLinkStatusIdentifier.Approved; 

     this._irLinkService.UpdateDealershipIRLink(this.DealershipIRLink); 

     this.Updated(e); 
    } 
} 

Однако обработчик, OnUpdated всегда null поэтому событие никогда не поднимается. Как будто элемент управления каким-то образом теряет привязку к событию. Может ли кто-нибудь увидеть, что я сделал неправильно здесь?

ответ

1

Регистрация обработчика событий в ItemCreated вместо ItemDataBound который срабатывает только тогда, когда вы привязка элемента управления, а не на каждом постбэка (обязательно):

protected void rptPendingDmsRequests_ItemCreated(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     DmsRegisterPod dmsRegisterPod = (DmsRegisterPod)e.Item.FindControl("ucDmsRegisterPod"); 
     dmsRegisterPod.OnUpdated += dmsRegisterPod_OnUpdated; 
    } 
} 

Все другая логика, которая зависит от источника данных принадлежит ItemDataBound:

protected void rptPendingDmsRequests_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     DealershipIRLink irLink = (DealershipIRLink)e.Item.DataItem; 
     DmsRegisterPod dmsRegisterPod = (DmsRegisterPod)e.Item.FindControl("ucDmsRegisterPod"); 
     dmsRegisterPod.ValidationGroup = string.Format("dms-pod-{0}", e.Item.ItemIndex); 
     dmsRegisterPod.DealershipIRLink = irLink; 
    } 
} 
+0

Есть трюк, спасибо большое. Из любопытства, что происходит с событием? Было ли оно потеряно во время обратной передачи? – DGibbs

+1

@DGibbs: ** все объекты ** расположены в конце жизненного цикла страницы и должны быть воссозданы при каждой обратной передаче. Это происходит автоматически при контрольных значениях, таких как «TextBox.Text» из-за «ViewState» или обработчиков событий, которые добавляются декларативно, но все остальные объекты должны быть воссозданы вручную. –

+0

Должен ли я снова применить группу проверки/'DealershipIRLink' в обработчике' ItemCreated'? В настоящее время я храню идентификатор dataitem в скрытом поле, а затем извлекаю из базы данных в 'Accept', но было бы неплохо не делать этого. Я предполагаю, что это невозможно из-за того, что «DataSource» явно не установлен. – DGibbs

Смежные вопросы