ItemCommand срабатывает перед ItemDataBound на PostBack? WTH?
Это просто глупо. Я занимаюсь этим более 5 часов и не могу понять, почему мои долбанные команды не запускаются должным образом. Единственное, что срабатывает правильно, это встроенные команды "Редактировать" и "Отмена"
наценка
<asp:ListView ID="NewProduct" runat="server" DataSourceID="NewProductSDS" DataKeyNames="ID">
<ItemTemplate>
<div>
<asp:LinkButton ID="accept" runat="server" CommandName="Accept" />
<asp:LinkButton ID="edit" runat="server" CommandName="Edit" />
<asp:LinkButton ID="delete" runat="server" CommandName="Reject" />
<%# Eval("Product")%>
</div>
</ItemTemplate>
<EditItemTemplate>
<div>
<asp:LinkButton ID="accept" runat="server" CommandName="Accept" />
<asp:LinkButton ID="cancel" runat="server" CommandName="Cancel" />
<asp:TextBox ID="NewProductName_tb" runat="server"></asp:TextBox>
</div>
</EditItemTemplate>
</asp:ListView>
<asp:SqlDataSource ID="NewProductSDS" runat="server"
ConnectionString="<%$ ConnectionStrings:myConnectionString %>"
SelectCommand="select ID, Product from Products">
</asp:SqlDataSource>
Codebehind
Protected Sub ItemBind(ByVal sender As Object, ByVal e As ListViewItemEventArgs) Handles NewProduct.ItemDataBound
If e.Item.ItemType = ListViewItemType.DataItem Then
sender.DataKeys(e.Item.DataItemIndex).Value.ToString() 'get the datakey
'Display each key as it's created for troubleshooting.
Label1.Text += "bound: " + sender.DataKeys(e.Item.DataItemIndex).Value.ToString() + "<br />"
End If
End Sub
Protected Sub ItemClick(ByVal sender As Object, ByVal e As CommandEventArgs) Handles NewProduct.ItemCommand
'Check if an event fired when a LinkButton is clicked.
Label1.Text = "Command Event Fired"
If e.CommandName = "Accept" Then
Session.Add("PKey", sender.DataKeys(e.CommandArgument).Value.ToString)
Label1.Text = "Accept key " + Session.Item("PKey")
ElseIf e.CommandName = "Reject" Then
Session.Add("PKey", sender.DataKeys(e.CommandArgument).Value.ToString)
Label1.Text = "Reject key " + Session.Item("PKey")
End If
End Sub
Вот и весь код, который я использую для отладки этого мусора. Самая странная вещь, которую я не могу понять, это то, что все клавиши отображаются на новой странице, загружаясь примерно так...
bound: 9
bound: 12
bound: 27
bound: 31
bound: 32
Затем внезапно, когда я нажимаю встроенную Команду (Изменить или Отмена в этом случае, обратите внимание, что они не в моем ItemCommand
код обработчика событий) этот мусор появляется, подразумевая для меня, что он видит щелчок перед привязкой.
Command Event Firedbound: 9
bound: 12
bound: 27
bound: 31
bound: 32
Что бы ни происходило, проблема, которую я пытаюсь решить, заключается в том, что мои пользовательские команды по какой-то причине не распознаются. Есть идеи? Я искал ответы сверху вниз и ничего:(
Если вы скопировали весь этот код в новый проект, он должен скомпилироваться. Я был бы когда-либо так благодарен за вашу помощь. --- Я становлюсь настолько отчаянным, что собираюсь справиться с каждым неприятным событием для ListView
контролировать в надежде раскрыть что-то о порядке стрельбы и, возможно, получить представление о том, что происходит не так. ---:'(
ОБНОВЛЕНИЕ: я сделал это, лол. Интересно, но не уверен, что это говорит мне что-нибудь новое. Вот что запускается при загрузке новой страницы со всеми связанными событиями:
Init
Load
DataBinding
ItemCreated
bound: 9
ItemCreated
bound: 12
ItemCreated
bound: 27
ItemCreated
bound: 31
ItemCreated
bound: 32
DataBound
PreRender
1 ответ
Я считаю, что порядок событий (ItemClick, затем ItemDataBound) является правильным порядком обработки. ItemClick запускается с клиента, затем перед отправкой страницы обратно пользователю запускается ItemDataBound.
Я бы посоветовал попытаться добавить определенные события OnClick для каждой из ваших пользовательских кнопок, чтобы увидеть, запускаются ли они.
Обновить:
Я подозреваю, что вы также можете столкнуться с исключениями в рамках события ItemClick. Если вы переместите настройку метки над манипуляцией сеансом, вы можете увидеть, что метка обновляется с помощью пользовательского кода.
Вы должны обернуть тело события в обработчик исключений и пройти отладку, чтобы увидеть, какое исключение вызывается.
Возможно, вам также будет лучше обслужить, приведя некоторые свойства, с которыми вы работаете, к их нативным типам. Например:
Dim theListView As ListView
theListView = DirectCast(sender, ListView)
Dim theDataItem As ListViewDataItem
theDataItem = DirectCast(e.Item, ListViewDataItem)
If e.CommandName = "Accept" Then
Label1.Text = "Accept key " + Session.Item("PKey")
Session.Add("PKey", theListView.DataKeys(theDataItem.DisplayIndex).Value.ToString)
ElseIf e.CommandName = "Reject" Then
Label1.Text = "Reject key " + Session.Item("PKey")
Session.Add("PKey", theListView.DataKeys(theDataItem.DisplayIndex).Value.ToString)
End If