#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)