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
Другие вопросы по тегам