2013-07-03 3 views
-1

Я столкнулся с типичной проблемой с ListView и параллелизмом. У меня есть ListView, который я привязываю в коде позади (не используя SQLDataSource).Проблема параллелизма ListView

  1. Я связываю ListView в Page_Load с коллекцией, возвращенной из базы данных.
  2. Я обрабатывать команду "редактировать" в "ItemEditing" обработчик событий, как это:
Me.MyListView.EditIndex = e.NewEditIndex; 
BindMyListView(); 
Me.MyListView.InsertItem.Visible = False; 
  1. Другие операции обрабатываются таким же образом, через 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 
+0

downvoter: нужно объяснить? – Abhitalks

ответ

0

, не видя вас код, трудно сказать наверняка, но на основе по вашему описанию вы связываете ListView в Page_Load каждый раз.

Вы должны изменить это так, чтобы вы связать ListView в загрузке страницы, только если это не должность обратно:

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

Мой образец находится в C#, но, будем надеяться, будет легко перевести на VB.

+0

Я редактировал вопрос, чтобы включить код. Надеюсь, поможет. Кажется, что требуется связать ListView на каждом PostBack, иначе редактирование не будет работать! – Abhitalks

+0

@abhitalks Не требуется связывать его каждый раз, если вы не отключили viewstate. Привяжите его один раз при загрузке страницы (если не обратная передача). Если viewstate включен, он должен работать. – user1429080

+0

О да. Ты прав. Я всегда сохраняю свой ViewState. Я думаю, вы указали мне указатель. Позвольте мне попробовать с включенным ViewState и посмотреть .. Спасибо. – Abhitalks

Смежные вопросы