VB. net как мне объединить списки и классы? - PullRequest
0 голосов
/ 18 апреля 2020

Вот мои определения:

Public Class RouteDetails
    Public strRoad As String
    Public strToLane As String
    Public strToDirection As String
End Class

Public Class Route
    Public lstRouteDetails As List(Of RouteDetails)
End Class

ByVal lstRouteList As List(Of Route) (part of a function definition)

Извините, я пытался поместить раздел определений в блок кода, но по какой-то причине он не работает.

Вот раздел код из той функции, с которой у меня возникают проблемы:

            rlcRoute = New Route
            lstRouteList.Add(rlcRoute)
            rdcRouteStep.strRoad = sdrNextJunction.GetValue(3)
            rdcRouteStep.strToLane = sdrNextJunction.GetValue(2)
            rdcRouteStep.strToDirection = sdrNextJunction.GetValue(1)
            For intloop = 0 To lstRouteList.Count - 1
                lstRouteList(intloop).lstRouteDetails.Add(rdcRouteStep)
            Next

Строка в пределах для l oop завершается с:

System.NullReferenceException : 'Ссылка на объект не установлена ​​для экземпляра объекта.'

System.Collections.Generi c .List.this [int] .get.lstRouteDetails is Nothing.

Если я правильно понимаю ошибку, то это говорит мне, что я не создал экземпляр lstRouteDetails для этого экземпляра Route? Если это правильно, то я был бы признателен за советы о том, как этого добиться? Я попробовал несколько комбинаций. Структура, которую я пытаюсь получить, выглядит следующим образом:

RouteList представляет собой список объектов типа route

Каждый объект Route содержит несколько объектов типа RouteDetails

Спасибо

1 Ответ

0 голосов
/ 18 апреля 2020

Вам не нужен класс для вашего списка. Вы можете просто создать один в вашей форме. Я добавил в ваш класс собственный конструктор, чтобы вы могли установить все свойства класса в одну строку, как показано в подпункте BuildList. Мне пришлось добавить обратно конструктор по умолчанию (без параметров). С помощью конструктора по умолчанию свойства устанавливаются индивидуально. Я также добавил переопределение метода .ToString, чтобы мы могли использовать его в форме. (См. Метод OPCode)

Класс

Public Class RouteDetails

    Public strRoad As String
    Public strToLane As String
    Public strToDirection As String

    Public Sub New()

    End Sub

    Public Sub New(Road As String, ToLane As String, Direction As String)
        strRoad = Road
        strToLane = ToLane
        strToDirection = Direction
    End Sub

    Public Overrides Function ToString() As String
        Return $"Road is {strRoad}, Lane is {strToLane}, Direction is {strToDirection}"
    End Function

End Class

Форма

Private RouteList As New List(Of RouteDetails)

Private Sub BuildList_Click(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim Route As New RouteDetails()
    Route.strRoad = "Main Street"
    Route.strToLane = "Park Lane"
    Route.strToDirection = "North East"
    RouteList.Add(Route)
    'or with the custom constructor
    Dim Route2 As New RouteDetails("Wall Steet", "Mulberry Lane", "South West")
    RouteList.Add(Route2)
End Sub

Вы можете см. пункты в списке в любом месте формы.

Private Sub OPCode()
    MessageBox.Show(RouteList(1).strToLane)
    For Each item As RouteDetails In RouteList
        ListBox1.Items.Add(item) 'The ListBox calls .ToString on the item for display
    Next
End Sub

РЕДАКТИРОВАТЬ

Расширенный код

Public Class Route
    Public RouteDetailsList As New List(Of RouteDetails)
    Public Name As String

    Public Sub New(RDL As List(Of RouteDetails), nme As String)
        RouteDetailsList = RDL
        Name = nme
    End Sub

    Public Sub New()

    End Sub

    Public Overrides Function ToString() As String
        Return Name
    End Function
End Class

Чтобы проверить код в вызов Form_Load BuildRouteList

Private RouteList As New List(Of Route)

Private Sub BuildRouteList()
    Dim Details = {New RouteDetails("MainStreet", "Park Lane", "North East"), New RouteDetails("Wall Steet", "Mulberry Lane", "South West")}
    'Uses the construtor List(Of T)(IEnumerable<T>)
    Dim R As New Route(New List(Of RouteDetails)(Details), "1")
    RouteList.Add(R)
    Dim Details2 = {New RouteDetails("Wall Street", "Strawberry Lane", "South West"), New RouteDetails("Pine Street", "Little Maid Lawnd", "North")}
    Dim R2 As New Route(New List(Of RouteDetails)(Details2), "2")
    RouteList.Add(R2)
End Sub

При нажатии кнопки вызывается OPCode1 (предполагается, что ListBox1 присутствует

Private Sub OPCode1()
    MessageBox.Show(RouteList(0).RouteDetailsList(1).strToLane) 'shows Mulberry Lane
    For Each item As Route In RouteList
        ListBox1.Items.Add(item)
        For Each route In item.RouteDetailsList
            ListBox1.Items.Add(route) 'The ListBox calls .ToString on the item for display
        Next
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...