我陷入了 ListView 和并发的典型问题。我有一个 ListView,我在后面的代码中绑定(不使用 SQLDataSource)。
- 我将 Page_Load 中的 ListView 与从数据库返回的集合绑定。
- 我在“ItemEditing”事件处理程序中处理“编辑”命令,如下所示:
Me.MyListView.EditIndex = e.NewEditIndex;
BindMyListView();
Me.MyListView.InsertItem.Visible = False;
ItemInserting
通过,ItemUpdating
等以相同的方式处理其他操作ItemDeleting
。
当我浏览页面时,ListView 显示得很好。当我单击“编辑”命令链接时,ListView 很好地进入了编辑模式。当我单击“保存”命令链接时,记录完美保存。都好。
当ListView 在页面上加载并且其他一些用户在我单击该记录上的“编辑”之前删除记录时,问题就开始了。ListView 进入编辑模式,但在下一行。删除记录时也会发生同样的情况。如果其他用户在我单击“删除”之前删除了一条记录,则下一条记录将被删除。
经过一番折腾,我可以看到它是框架正在使用的“索引”。因此,如果记录已被删除,当 ListView 再次绑定(回发)时,索引现在将指向下一条记录!
我无法解决这个问题。我试过使用“CommandArgument”,但它也返回下一行的参数。当在 Page_Load 期间绑定 ListView 时,编辑索引指针现在位于下一条记录,并且“CommandArgument”包含下一行的参数。
需要你们的帮助。
谢谢/@bhi
这是完整的代码,可以正常工作,但存在上述问题:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
PrepareListView()
End Sub
Private Sub BindMyListView()
Dim items = BusinessLogic.GetData()
Me.MyListView.DataSource = items
Me.MyListView.DataBind()
End Sub
Private Sub MyListView_ItemCanceling(sender As Object, e As System.Web.UI.WebControls.ListViewCancelEventArgs) Handles MyListView.ItemCanceling
e.Cancel = True
Me.MyListView.EditIndex = -1
BindMyListView()
Me.MyListView.InsertItem.Visible = True
End Sub
Private Sub MyListView_ItemDeleting(sender As Object, e As System.Web.UI.WebControls.ListViewDeleteEventArgs) Handles MyListView.ItemDeleting
Dim autoId As Integer = 0
autoId = Integer.Parse(Me.MyListView.DataKeys(e.ItemIndex).Value.ToString)
BusinessLogic.Delete(autoId)
BindMyListView()
End Sub
Private Sub MyListView_ItemEditing(sender As Object, e As System.Web.UI.WebControls.ListViewEditEventArgs) Handles MyListView.ItemEditing
Me.MyListView.EditIndex = e.NewEditIndex
BindMyListView()
Me.MyListView.InsertItem.Visible = False
End Sub
Private Sub MyListView_ItemInserting(sender As Object, e As System.Web.UI.WebControls.ListViewInsertEventArgs) Handles MyListView.ItemInserting
Dim item As DomainModel.DataObject = New DomainModel.DataObject
item.Id = 0
item.DataValue = DirectCast(e.Item.FindControl("txtDataValue"), TextBox).Text
BusinessLogic.Save(item)
BindMyListView()
End Sub
Private Sub MyListView_ItemUpdating(sender As Object, e As System.Web.UI.WebControls.ListViewUpdateEventArgs) Handles MyListView.ItemUpdating
Dim item As DomainModel.DataObject = New DomainModel.DataObject
item.Id = Integer.Parse(Me.MyListView.DataKeys(e.ItemIndex).Value.ToString)
item.DataValue = DirectCast(Me.MyListView.Items(e.ItemIndex).FindControl("txtDataValue"), TextBox).Text
BusinessLogic.Save(item)
Me.MyListView.EditIndex = -1
BindMyListView()
End Sub