使用非集合对象作为一个DataSource(Using a non-collection objec

2019-07-29 05:21发布

DOTNET框架组件的一束使用DataSource组件。 我有一个具有许多设置可以修改它代表的数据源的一个对象。 我想设置这个对象为一组组合框和DataGridViewComboBoxCells的下拉列表中的数据源。

试图以实际挂钩的东西到组合框时,我的问题就来了。 我想这是因为更改数据源可能发生,一旦数据源已定,我不得不使用这些BindingSource的事情之一,但MSDN文献是拉动其一贯告诉我的恶作剧一个BindingSource的是什么瞒着我做什么的或者它是如何工作的。

什么是你们可以建议该挂钩对象为达一个DataSource / BindingSource的最好方法是什么?

编辑:
显然,这个类是垃圾,但它说明了某种物体的我现在有。
大部分的时间是在向上此刻的空气,但基本上是这样显示的是我的班是不是集合本身,而是包含一个。 我需要能够指示ComboBox的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

Answer 1:

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

龙版本:

DataSource典型地是:

  • 单个对象(用于简单结合)
  • 列表源( IListSource
  • 列表( IList

既然你在使用它的下拉,这听起来像你想的第二两个中的一个,一般IListIListSource是比较少见的,除了DataTable )。

更改一旦你限制,你需要通知。 对于简单的绑定(单个对象),无论是INotifyPropertyChanged*Changed事件的路要走-但名单需要实现IBindingList ,提高ListChanged事件告知发生了什么事的控制。

说实话,这是很多不感兴趣的工作,这是很容易使一个烂摊子。

务实的做法是一起工作BindingList<T>可能来自它继承)。 这给你所有的名单通知,其中包括列表中,如果你实现改变项目的支持INotifyPropertyChanged上的项目(不支持*Changed的事件,虽然)。

警告:并非所有控件关心的通知...如果他们不这样做有没有很多可以做的。 所以,如果你没有看到添加/交换/等,即使使用BindingList<T> -或者看不到的项目更新时实现INotifyPropertyChanged ,然后......呃,坚韧?



文章来源: Using a non-collection object as a DataSource