Я столкнулся с типичной проблемой с ListView и параллелизмом. У меня есть ListView, который я привязываю в коде позади (не используя SQLDataSource).Проблема параллелизма ListView
- Я связываю ListView в Page_Load с коллекцией, возвращенной из базы данных.
- Я обрабатывать команду "редактировать" в "ItemEditing" обработчик событий, как это:
Me.MyListView.EditIndex = e.NewEditIndex;
BindMyListView();
Me.MyListView.InsertItem.Visible = False;
- Другие операции обрабатываются таким же образом, через
ItemInserting
,ItemUpdating
,ItemDeleting
и так далее.
Когда я просматриваю страницу, ListView отображается нормально. Когда я нажимаю ссылку «Изменить», тогда ListView прекрасно попадает в режим редактирования. Когда я нажимаю ссылку «Сохранить», запись отлично сохраняется. Все хорошо.
Проблема проблема начинается, когда ListView загружается на страницу, а другой пользователь удаляет запись непосредственно перед тем, как я нажимаю «редактировать» на этой записи. ListView переходит в режим редактирования, но в следующей строке. То же самое происходит при удалении записи. Если какой-либо другой пользователь удаляет запись непосредственно перед тем, как я нажимаю «Удалить», следующая запись удаляется.
После долгих размахов я увидел, что это «индекс», который используется каркасом. Итак, если запись уже удалена, когда ListView снова связывается (после обратной передачи), индекс теперь указывает на следующую запись!
Я не могу обойти это. Я попытался использовать «CommandArgument», но он также возвращает аргумент следующей строки. Когда ListView привязан во время Page_Load, указатель указателя редактирования теперь находится в следующей записи, а «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
downvoter: нужно объяснить? – Abhitalks