使用非集合对象作为DataSource

时间:2009-06-24 12:09:59

标签: .net data-binding bindingsource

一堆dotnet框架组件使用DataSource组件。 我有一个对象有许多设置可以修改它代表的数据源。我想将此对象设置为一组ComboBoxes和DataGridViewComboBoxCells的下拉数据源。

我的问题是在尝试将事物实际挂钩到ComboBox时。我想这是因为一旦设置了DataSource就可以对DataSource进行更改,我必须使用其中一个BindingSource的东西,但MSDN文献正在拉扯它通常的恶作剧,告诉我什么是bindingSource而不告诉我它是做什么的或者它是如何工作的。

你们建议将这个对象挂钩为DataSource / BindingSource的最佳方法是什么?

编辑:
显然这个类是垃圾,但它说明了我现在拥有的那种对象 目前大部分时间都在播出,但基本上显示的是我的课程本身不是一个集合,而是包含一个集合。我需要能够指示ComboBox的DataSource属性,这里有一个易失性列表,并且它应该使用该列表作为其下拉列表的DataSource。

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 个答案:

答案 0 :(得分:3)

简短版:使用BindingList<T> ...

长版:

DataSource通常是:

  • 单个对象(用于简单绑定)
  • 列表来源(IListSource
  • 列表(IList

由于您将其用于下拉列表,因此您会想要其中的第二个,通常IListIListSource相对较少,DataTable除外)。

对于一旦绑定后的更改,您需要通知。对于简单绑定(单个对象),INotifyPropertyChanged*Changed事件是可行的方法 - 但对于列表,您需要实现IBindingList并引发ListChanged事件以告知控制发生了什么。

老实说,这是很多非有趣的工作,很容易搞得一团糟。

实用的方法是使用BindingList<T>(可能继承自它)。这为您提供了所有列表通知,包括对项目中 项目的支持,如果您对项目实施INotifyPropertyChanged(但它不支持*Changed事件)。

警告:并非所有控制都关心通知......如果没有,那么你可以做很多事情。因此,如果您在使用BindingList<T>时没有看到添加/交换/等等 - 或者在实施INotifyPropertyChanged时没有看到项目更新,那么......呃,强硬吗?