Я создал пользовательский веб-элемент управления с именем Activity. Я определил общедоступное событие в этом пользовательском веб-элементе управления под названием OnActivityDelete. В элементе управления «Активность» есть кнопка удаления. При нажатии кнопки удаления элемент управления «Активность» запускает событие OnActivityDelete. Я использую этот пользовательский веб-элемент управления в репитере. Я назначаю обработчик события для события OnActivityDelete в событии, связанном с данными элемента репитера. Когда я нажимаю кнопку удаления для элемента управления «Активность», событие запускается из элемента управления «Активность», но оно никогда не попадает в обработчик событий на странице, которая использует элемент управления. (Я вошел в код с помощью отладчика и подтвердил это поведение).
Я подозреваю, что это поведение связано с тем, что обработчики событий добавляются в код, когда я связываю ретранслятор с источником данных, что я делаю только в том случае, если страница не отправляет обратно.
Можно ли определить обработчик событий для элемента управления Activity в разметке страницы aspx? Если так, это решит мою проблему?
Если нет, нужно ли привязывать ретранслятор и подключаться к событиям при каждой загрузке страницы, чтобы решить мою проблему (это работает, я только что проверил это), или есть какой-то трюк с просмотром состояния, чтобы события сохранялись
Разметка повторителя на странице:
<asp:Repeater ID="rptrActivites" runat="server" EnableViewState="true">
<ItemTemplate>
<div class="activity">
<crm:Activity ID="activityView" runat="server" Activity="<%#Container.DataItem %>" EnableViewState="true" />
</div>
</ItemTemplate>
</asp:Repeater>
Код страницы:
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not Page.IsPostBack Then
GetActivities()
End If
End Sub
Private Sub GetActivities()
Dim oDS As DataSet
'Code removed for brevity'
rptrActivites.DataSource = oDataView
rptrActivites.DataBind()
End Sub
Private Sub rptrActivites_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptrActivites.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim activityView As Activity = e.Item.FindControl("activityView")
If activityView IsNot Nothing Then
AddHandler activityView.OnActivityDelete, AddressOf ActivityDelete
End If
End If
End Sub
Private Sub ActivityDelete(ByVal sender As Object, ByVal e As ActivityDeleteEventArgs)
'This never fires'
End Sub
Разметка элемента управления «Активность»:
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="Activity.ascx.vb" Inherits=".Activity" %>
<!-- code removed for brevity's sake -->
<asp:LinkButton ID="btnDelete" runat="server" Text="Delete" />
<!-- code removed for brevity's sake -->
Код контроля активности:
Public Event OnActivityDelete(ByVal sender As Object, ByVal e As ActivityDeleteEventArgs)
Private Sub btnDelete_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDelete.Click
RaiseEvent OnActivityDelete(Me, New ActivityDeleteEventArgs())
End Sub