-1

我陷入了 ListView 和并发的典型问题。我有一个 ListView,我在后面的代码中绑定(不使用 SQLDataSource)。

  1. 我将 Page_Load 中的 ListView 与从数据库返回的集合绑定。
  2. 我在“ItemEditing”事件处理程序中处理“编辑”命令,如下所示:
Me.MyListView.EditIndex = e.NewEditIndex;
BindMyListView();
Me.MyListView.InsertItem.Visible = False;
  1. 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
4

1 回答 1

0

如果没有看到您的代码,很难确定,但根据您的描述,您每次都ListView在绑定。Page_Load

您应该更改此设置,以便ListView仅在不是回发时绑定页面内加载:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindMyListView();
    }
}

我的示例是用 C# 编写的,但希望可以很容易地转换为 VB。

于 2013-07-03T11:28:47.630 回答