Нужен ли мне класс, если мне нужно только 1 свойство (на данный момент)?

#asp.net #vb.net #class

#asp.net #vb.net #класс

Вопрос:

Обновление: я не уточнил, но я имел в виду, что это вопрос о том, где / как я буду использовать функцию для возврата списка строк, когда я пытаюсь просто работать с классами.

У меня есть класс под названием Account .

У меня есть класс доступа к данным под названием AccountDAO.

У меня есть различные функции, которые возвращают списки объектов, таких как GetAllAccounts, GetAccountByID и т.д.

Я хочу заполнить выпадающий список только именами учетных записей и ничем другим. Это оказывается довольно медленным при использовании списков объектов и привязке их к dropdownlist.

Я чувствую, что должен использовать простой оператор типа «Выберите Account_Name из blah» и возвращать список строк, но я не знаю, как использовать это в моем классе и классе доступа к данным.

Как мне справиться с этим затруднительным положением?

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

1. Насколько велик объект Account? Списки объектов создаются быстро, поэтому это не должно быть проблемой для использования в целом.

2. @Kirk он очень маленький, но со временем будет расти и расти.

Ответ №1:

Вы можете использовать список string, s и привязать список строк к выпадающему списку без проблем … DDL может это поддерживать, просто оставьте реквизиты DataTextField и DataValueField, и он отобразит имя учетной записи как есть, которое это имя будет доступно через свойство Text и Value ListItem .

Мне нравится использовать объекты для согласования с остальной частью приложения (для каких других областей может потребоваться класс), и если по какой-то причине вы захотите добавить AccountKey позже, если вы используете объект, все, что вам нужно сделать, это добавить свойство. В противном случае, если вы используете строки, вам придется позже переключить привязку, чтобы указать на объект.

HTH.

Ответ №2:

Нет ничего плохого в создании функции, которая возвращает только список строк. Однако вы можете задаться вопросом, не лучше ли ограничить количество записей, которые вы хотите поместить в список, и использовать какую-то подкачку.

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

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

Ответ №3:

Предполагая, что вы используете a List<> , вы можете попробовать что-то вроде этого:

 IEnumerable<string> nameList = accountList.Select(t => t.AccountName);
  

Или если вам нужно List :

 List<string> nameList = accountList.Select(t => t.AccountName).ToList();
  

Ответ №4:

Доверьтесь своим чувствам. Используйте datareader для выбора списка, а затем загрузите их в arraylist, который затем можно привязать к выпадающему списку. В качестве альтернативы, используйте что-то вроде этого метода, который я использую для предоставления как DisplayMember, так и ValueMember, который использует класс (с обоими значениями) в качестве членов arraylist . Это должно дать вам общее представление. (Примечание: обычно я включаю этот код в класс доступа к данным (MyBase), членами которого являются StartReader, _datRdr, ReadNext и_readervalid. Но общая идея не изменилась.)

 Public Sub LoadDataSource(ByRef PlantDataSource As PlantSource, Optional ByVal Filter As String = "", Optional ByVal IncludeBlankItem As Boolean = False)

    PlantDataSource = New PlantSource
    If IncludeBlankItem Then
        PlantDataSource.Add(0, "")

    End If
    If Filter = String.Empty Then
        Call StartReader(" Order by PlantName")
    Else
        Call StartReader(String.Concat(" Where ", Filter, " Order by PlantName"))

    End If

    If _DatRdr.HasRows Then

        While MyBase._ReaderValid
            PlantDataSource.Add(PlantId, PlantName)
            ReadNext()
        End While
    End If
    Call CloseReader()

End Sub

Private Class PlantListing

    Private _PlantList As New ArrayList

    Public Sub Add(ByVal PlantId As Integer, ByVal PlantName As String)

        _PlantList.Add(New PlantDataItem(PlantId, PlantName))

    End Sub

    Public ReadOnly Property List() As ArrayList
        Get
            Return _PlantList
        End Get
    End Property

End Class

Private Class PlantDataItem
    Private _PlantId As Integer
    Private _PlantName As String

    Public Sub New(ByVal pPlantId As Integer, ByVal pPlantName As String)
        Me._PlantId = pPlantId
        Me._PlantName = pPlantName
    End Sub

    Public ReadOnly Property PlantName() As String
        Get
            Return _PlantName
        End Get
    End Property

    Public ReadOnly Property PlantId() As Integer
        Get
            Return _PlantId
        End Get
    End Property

    Public ReadOnly Property DisplayValue() As String

        Get
            Return CStr(Me._PlantId).Trim amp; " - " amp; _PlantName.Trim
        End Get

    End Property

    Public Overrides Function ToString() As String

        Return CStr(Me._PlantId).Trim amp; " - " amp; _PlantName.Trim

    End Function

End Class