Вставка свойства класса в список через цикл foreach в vb.net

#asp.net #vb.net

#asp.net #vb.net

Вопрос:

Я пытаюсь вставить свойство класса в список через цикл foreach в VB.NET .

 Dim objCoInsurers As List(Of CoInsurer)
 

Класс CoInsurer состоит из 5 свойств

Ниже приведен код, в котором свойства класса вставляются в мой список

  objCoInsurers = New List(Of CoInsurer)
 Dim oCoInsurer As New CoInsurer
 For Each row As GridViewRow In grdCoInsurance.Rows
  Dim lblCoInsurerID = DirectCast(row.FindControl("lblCoInsurerID"), Label)
  Dim textCoInsurerID As String = lblCoInsurerID.Text
  Dim lblCoInsurerName = DirectCast(row.FindControl("lblCoInsurerName"), Label)
  Dim CoInsurerName As String = lblCoInsurerName.Text
oCoInsurer.InsurerID = lblCoInsurerID.Text
oCoInsurer.InsurerName = lblCoInsurerName.Text
 objCoInsurers.Add(oCoInsurer)
Next
 

Проблема заключается в том, что когда два списка содержат одинаковое значение, первый список перезаписывает второй, если количество строк равно 2 в gridview или более

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

1. Пожалуйста, не помечайте C #, когда ваш язык VB.NET

Ответ №1:

Подумайте об этом. Допустим, вы хотите добавить людей в список, используя ручку и бумагу. Я представляюсь вам в синей рубашке, и вы записываете мое имя. Затем я снимаю свою синюю рубашку, надеваю красную рубашку и представляюсь вам, а вы записываете мое имя. Затем я снимаю свою красную рубашку, надеваю зеленую рубашку и представляюсь вам, а вы записываете мое имя. Сколько имен у вас в списке? Скольким людям соответствуют эти имена? Какого цвета рубашка у людей, которым соответствуют эти имена?

Учитывая, что ООП основано на поведении объектов реального мира, подумайте о том, что на самом деле делает ваш код. Сколько ColInsurer объектов создает ваш код? Только один, верно? Не имеет значения, сколько рубашек разных цветов вы надеваете на этот объект и сколько раз добавляете его в список, все равно остается только один объект, поэтому он может быть одет только в одну рубашку одновременно. В конце вашего цикла каждый элемент в списке ссылается на один и тот же объект, и этот объект будет иметь любые значения свойств, которые вы установили последними.

Если вы хотите добавить несколько различных объектов в список, то вам действительно нужно создать несколько различных объектов. Это означает перемещение создания объекта внутри цикла, так что это происходит на каждой итерации. Вы создаете новый объект, устанавливаете его свойства, а затем добавляете его в список:

 For Each row As GridViewRow In grdCoInsurance.Rows
    Dim oCoInsurer As New CoInsurer
 

Ответ №2:

Я предполагаю, что ваш класс выглядит примерно так.

 Public Class CoInsurer
    Public Property InsurerID As String
    Public Property InsurerName As String
End Class
 

Мне интересно, является ли InsurerID это a String , а не Integer or Long . Если это число, обязательно окружите значение присваивания в цикле CInt() символом или CLng()

Я избавился от некоторых ненужных переменных. Как объяснил jmcilhinney, вам необходимо создавать новый экземпляр CoInsurer для каждой итерации вашего цикла.

 Private Sub OPCode()
    For Each row As GridViewRow In grdCoInsurance.Rows
        Dim oCoInsurer As New CoInsurer
        oCoInsurer.InsurerID = DirectCast(row.FindControl("lblCoInsurerID"), Label).Text
        oCoInsurer.InsurerName = DirectCast(row.FindControl("lblCoInsurerName"), Label).Text
        objCoInsurers.Add(oCoInsurer)
    Next
End Sub