ItemCommand срабатывает перед ItemDataBound на PostBack?WTH? - PullRequest
0 голосов
/ 05 ноября 2011

Это просто глупо. Я занимаюсь этим более 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 Ответ

1 голос
/ 05 ноября 2011

Я считаю, что порядок событий (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
...