Использование не коллекционного объекта в качестве источника данных - PullRequest
1 голос
/ 24 июня 2009

Связка компонентов каркаса dotnet использует компонент DataSource. У меня есть объект, который имеет ряд настроек, которые могут изменить источник данных, который он представляет. Я хотел бы установить этот объект как раскрывающийся DataSource набора ComboBoxes и DataGridViewComboBoxCells.

Моя проблема возникает, когда я пытаюсь подключить объект к ComboBox. Я предполагаю, что, поскольку изменения в DataSource могут произойти после того, как DataSource был установлен, я должен использовать одну из этих вещей BindingSource, но литература по MSDN не дает понять, что такое связывание Source, не рассказывая, что он делает или как это работает.

Как вы, ребята, можете предложить подключить этот Объект как DataSource / BindingSource?

EDIT:
Очевидно, этот класс нежелателен, но он иллюстрирует тот тип объекта, который у меня есть сейчас.
Большая часть времени находится в воздухе в данный момент, но в основном это показывает, что мой класс не сам сборник, а содержит его. Мне нужно иметь возможность указать свойству DataSource ComboBox, что здесь есть изменчивый список и что он должен использовать этот список в качестве источника данных для своего раскрывающегося списка.

Public Class DynamicDataSource
    Private basicList As New List(Of String)(New String() {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"})
    Private _showEvensOnly As Boolean
    Private _showNotContainingO As Boolean
    Public Property ShowEvensOnly() As Boolean
        Get
            Return _showEvensOnly
        End Get
        Set(ByVal value As Boolean)
            _showEvensOnly = value
        End Set
    End Property
    Public Property ShowNotContainingO() As Boolean
        Get
            Return _showNotContainingO
        End Get
        Set(ByVal value As Boolean)
            _showNotContainingO = value
        End Set
    End Property
    Public Function GetDynamicList() As List(Of String)
        Dim processMe As New List(Of String)(basicList)
        If Me._showEvensOnly Then
            For JJ As Integer = processMe.Count - 1 To 0 Step -1
                If JJ Mod 2 = 0 Then
                    processMe.Remove(processMe(JJ))
                End If
            Next
        End If

        If Me._showNotContainingO Then
            For JJ As Integer = processMe.Count - 1 To 0 Step -1
                If processMe(JJ).ToUpper.Contains("O"c) Then
                    processMe.Remove(processMe(JJ))
                End If
            Next
        End If

        Return processMe
    End Function
End Class

1 Ответ

3 голосов
/ 24 июня 2009

Короткая версия: используйте BindingList<T> ...

Длинная версия:

A DataSource обычно равно:

  • отдельный объект (для простого связывания)
  • список источников (IListSource)
  • список (IList)

Поскольку вы используете его для раскрывающегося списка, звучит так, как будто вам нужен один из вторых двух, обычно IList (IListSource относительно редко, за исключением DataTable).

Для внесения изменений после того, как вы связались, вам нужны уведомления. Для простых привязок (отдельных объектов) можно использовать события INotifyPropertyChanged или *Changed, но для списков необходимо реализовать IBindingList и вызвать событие ListChanged, чтобы сообщить элементу управления, что произошло.

Если честно, это много неинтересной работы, из которой очень легко устроить беспорядок.

Прагматичный подход - работать с BindingList<T> (возможно, наследуя его). Это дает вам все уведомления списка, включая поддержку элементов в , список меняется, если вы реализуете INotifyPropertyChanged для элементов (хотя он не поддерживает *Changed события, хотя).

Предостережение: не все элементы управления заботятся об уведомлениях ... и, если они этого не делают, вы ничего не можете с этим поделать. Так что, если вы не видите добавления / замены / и т.д. даже при использовании BindingList<T> - или вы не видите обновлений элементов при реализации INotifyPropertyChanged, тогда ... э, круто?

...