ItemCommand在PostBack上的ItemDataBound之前触发? WTH?

时间:2011-11-05 01:44:44

标签: asp.net vb.net listview itemdatabound itemcommand

这只是愚蠢的。我已经在这里待了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>

代码隐藏

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控件的每一个怪异事件,希望能揭示关于点火顺序的一些事情,或许可以了解什么&#39;出错了。 ---:&#39;(

更新:我做到了哈哈。有趣,但不确定它告诉我任何新的东西。以下是所有事件绑定的新页面加载的内容:

Init
Load
DataBinding
ItemCreated
bound: 9
ItemCreated
bound: 12
ItemCreated
bound: 27
ItemCreated
bound: 31
ItemCreated
bound: 32
DataBound
PreRender

1 个答案:

答案 0 :(得分: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