VB замена объекта в списке

#vb.net #list

#vb.net #Список

Вопрос:

У меня есть 2 списка approvedSuppliers и originalSupplierData

Когда заполняются утвержденные поставщики, мы клонируем запись в originalSupplierData . Если они изменили запись, но не сохранили, мы спрашиваем пользователя, хотят ли они отменить изменения. Если они хотят вернуться, я пытаюсь заменить запись в утвержденных поставщиках клоном исходных данных. Мой текущий код для возврата таков

     Public Sub RevertChanges(SupplierID As Integer)

    Dim orignalSupplier As Approved_Supplier = originalSupplierlist.Where(Function(x) x.ID = SupplierID).Single()
    Dim modifiedSupplier As Approved_Supplier = ApprovedSuppliers.Where(Function(x) x.ID = SupplierID).Single()

    modifiedSupplier = orignalSupplier.Clone


End Sub
  

modifiedSupplier обновляется исходными значениями, однако фактический элемент в списке не обновляется значениями.
Если я изменяю одно из свойств, список обновляется. Я не уверен, что я делаю неправильно, может кто-нибудь указать мне правильное направление, пожалуйста?

Редактировать код для заполнения списка из базы данных является

         supplierTableAdapter.Fill(supplierTable)

    _approvedSuppliers = New List(Of Approved_Supplier)
    originalSupplierlist = New List(Of Approved_Supplier)()

    For Each row As ApprovedSuppliersDataset.ApprovedSupplierRow In supplierTable
        supplier = New Approved_Supplier()

        supplier.supplierID = row.PLSupplierAccountID
        supplier.AccountNumber = row.SupplierAccountNumber
        supplier.SupplierName = row.SupplierAccountName
        supplier.SupplierAddress = CompileAddress(row)
        supplier.Phone = CompilePhoneNumber(row)

        If row.IsIDNull = False Then

            supplier.ID = row.ID

            If row.IsAdded_ByNull = False Then
                supplier.AddedBy = row.Added_By
            End If

            If row.IsApprovedNull = False Then
                supplier.Approved = row.Approved
            End If

            If row.IsAuditorNull = False Then
                supplier.Auditor = row.Auditor
            End If

            If row.IsAudit_CommentsNull = False Then
                supplier.AuditComments = row.Audit_Comments
            End If

            If row.IsAudit_DateNull = False Then
                supplier.AuditDate = row.Audit_Date
            End If

            If row.IsDate_AddedNull = False Then
                supplier.DateAdded = row.Date_Added
            End If

            If row.IsNotesNull = False Then
                supplier.Notes = row.Notes
            End If

            If row.IsQuestionnaire_Return_DateNull = False Then
                supplier.QuestionnaireReturnDate = row.Questionnaire_Return_Date
            End If

            If row.IsQuestionnaire_Sent_DateNull = False Then
                supplier.QuestionnaireSentDate = row.Questionnaire_Sent_Date
            End If

            If row.IsQuestionnaire_StatusNull = False Then
                supplier.QuestionnaireStatus = row.Questionnaire_Status
            End If

            If row.IsReplinNull = False Then
                supplier.Replin = row.Replin
            End If

            If row.IsReview_CommentsNull = False Then
                supplier.ReviewComment = row.Review_Comments
            End If

            If row.IsReview_DateNull = False Then
                supplier.ReviewDate = row.Review_Date
            End If

            If row.IsReviewerNull = False Then
                supplier.Reviewers = row.Reviewer
            End If

            If row.IsStakeholder_ContactNull = False Then
                supplier.StakeholderContact = row.Stakeholder_Contact
            End If

            If row.IsStandardsNull = False Then
                supplier.Standards = row.Standards
            End If

            If row.IsStandard_ExpiryNull = False Then
                supplier.StandardExpiry = row.Standard_Expiry
            End If

            If row.IsStatusNull = False Then
                supplier.Status = row.Status
            End If

            If row.IsSupplier_Expiry_DateNull = False Then
                supplier.SupplierExpiryDate = row.Supplier_Expiry_Date
            End If

            If row.IsSupplier_ScopeNull = False Then
                supplier.SupplierScope = row.Supplier_Scope
            End If

            If row.Is_T_CsNull = False Then
                supplier.TC = row._T_Cs
            End If
        End If

        supplier.ClearISDirty()
        _approvedSuppliers.Add(supplier)
        originalSupplierlist.Add(supplier.Clone)
    Next
  

и для клона мы имеем

   Public Function Clone() As Object Implements ICloneable.Clone
    Dim cloned As New Approved_Supplier()

    cloned.ID = Me.ID
    cloned.DateAdded = Me.DateAdded
    cloned.Status = Me.Status
    cloned.AddedBy = Me.AddedBy
    cloned.Approved = Me.Approved
    cloned.AuditDate = Me.AuditDate
    cloned.Auditor = Me.Auditor
    cloned.AuditComments = Me.AuditComments
    cloned.QuestionnaireStatus = Me.QuestionnaireStatus
    cloned.QuestionnaireSentDate = Me.QuestionnaireSentDate
    cloned.QuestionnaireReturnDate = Me.QuestionnaireReturnDate
    cloned.ReviewDate = Me.ReviewDate
    cloned.Reviewers = Me.Reviewers
    cloned.ReviewComment = Me.ReviewComment
    cloned.Standards = Me.Standards
    cloned.StandardExpiry = Me.StandardExpiry
    cloned.SupplierScope = Me.SupplierScope
    cloned.Replin = Me.Replin
    cloned.TC = Me.TC
    cloned.Notes = Me.Notes
    cloned.StakeholderContact = Me.StakeholderContact
    cloned.SupplierExpiryDate = Me.SupplierExpiryDate

    cloned.supplierID = Me.supplierID 
    cloned.AccountNumber = Me.AccountNumber
    cloned.SupplierName = Me.SupplierName
    cloned.SupplierAddress = Me.SupplierAddress
    cloned.Phone = Me.Phone
    cloned.Email = Me.Email
    cloned.ClearISDirty()
    Return cloned

End Function
  

Комментарии:

1. «фактический элемент в списке не обновляется значениями» — что вызывает отображение значений?

2. Можете ли вы показать код, используемый для создания элементов в originalSupplierList ? А код, используемый в методе Clone для вашего класса Approved_Supplier ?

3. Ваш код не может работать, потому что клон создает новый объект, и когда вы присваиваете ссылку на новый объект переменной modifiedSupplier , вы изменяете ссылку, хранящуюся в этой переменной, но вы не изменяете ссылку, хранящуюся в originalSupplierList Приведенный ниже ответ правильный, вам нужно изменить непосредственно ссылку, хранящуюся в списке, а не через промежуточную переменную

Ответ №1:

Вы не заменяете в списке, воздействуя на modifiedSupplier.

Попробуйте получить индекс modifiedSupplier, а затем заменить элемент с найденным индексом вашим клоном.

 Public Sub RevertChanges(SupplierID As Integer)

    Dim orignalSupplier As Approved_Supplier = originalSupplierlist.Where(Function(x) x.ID = SupplierID).Single()
    Dim modifiedIndex As Integer = ApprovedSuppliers.FindIndex(Function(x) x.ID = SupplierID)

    ApprovedSuppliers(modifiedIndex) = orignalSupplier.Clone()


End Sub
  

Комментарии:

1. Только что попробовал это, и список все еще не обновляется. Я думаю, что мне, возможно, придется пойти по пути рефакторинга и обновить отдельные свойства по отдельности

2. Чтобы убедиться, что я понял: пользователь изменяет свойства поставщиков в утвержденном списке, и его можно отменить. При возврате вы вызываете RevertChanges для всех измененных идентификаторов поставщика? Как вы сохраняете эти идентификаторы?

3. Видя код для метода Clone, я думаю, что это правильно и должно работать

4. Сценарий выглядит следующим образом: пользователь изменяет данные для поставщика, затем они переходят к следующему поставщику, если они не были сохранены, им предлагается сохранить или отменить. При возврате он возвращает методу идентификатор поставщика (уникальный для поставщика) того, который они отредактировали, затем заменяет измененную версию клоном с исходными данными.

5. Являются ли ваши свойства значениями или ссылочными типами? Например, если электронная почта представляет собой строку, ваш клон эффективно копирует строку другому поставщику. Но если вы создали класс «Email», то вы влияете на ту же ссылку на электронную почту, что и ваш клон. В этом случае вы также должны клонировать электронную почту (etc)