这太蠢了。我已经在这个超过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
控制,希望揭示一些关于射击顺序,也许得到一个想法是什么出了问题。——:"(
更新:我做到了,哈哈。很有趣,但我不确定它能告诉我什么新的东西。下面是所有事件绑定的新页面加载时触发的内容:
Init
Load
DataBinding
ItemCreated
bound: 9
ItemCreated
bound: 12
ItemCreated
bound: 27
ItemCreated
bound: 31
ItemCreated
bound: 32
DataBound
PreRender
我认为事件的顺序(ItemClick然后ItemDataBound)是正确的处理顺序。ItemClick从客户端触发,然后,在将页面发送回用户之前,触发ItemDataBound。
我建议尝试为每个自定义按钮添加特定的OnClick事件,看看它们是否会触发。
更新:
我怀疑您也可能在ItemClick事件中遇到异常。如果您将标签的设置移到Session操作之上,您可能会看到标签正在使用您的自定义代码进行更新。
您应该将事件体包装在异常处理程序中,并在调试中逐步执行以查看正在触发的异常。
如果将您正在使用的一些属性转换为它们的本机类型,您可能会得到更好的服务。例如:
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