代码之家  ›  专栏  ›  技术社区  ›  Frosty840

将非集合对象用作数据源

  •  1
  • Frosty840  · 技术社区  · 15 年前

    一组dotnet框架组件使用一个数据源组件。 我有一个对象,它有许多设置可以修改它所代表的数据源。我想将这个对象设置为一组组合框和DataGridView组合框的下拉数据源。

    我的问题来时,试图实际挂钩的东西到组合框。我想,因为一旦设置了数据源,对数据源的更改就可能发生,所以我必须使用这些绑定源中的一种,但是,在不告诉我绑定源是做什么的或如何工作的情况下,msdn文献正在恶作剧地告诉我它是什么绑定源。

    对于将这个对象作为数据源/绑定源连接起来,你们建议最好的方法是什么?

    编辑:
    显然,这个类是垃圾,但它说明了我现在拥有的对象类型。
    现在大部分时间都悬而未决,但这基本上表明我的班级不是一个集合本身,而是包含一个集合。我需要能够指示组合框的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 回复  |  直到 15 年前
        1
  •  3
  •   Marc Gravell    15 年前

    短版:使用 BindingList<T>

    长版本:

    DataSource 通常是:

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

    由于您正在使用它进行下拉列表,所以听起来您想要第二个两个中的一个,通常 伊利斯特 ( 异构源 是相对罕见的,除了 DataTable )

    对于绑定后的更改,需要通知。对于简单绑定(单个对象),可以 INotifyPropertyChanged *Changed 事件是前进的道路-但对于需要实现的列表 IBindingList 并提高 ListChanged 事件来告诉控件发生了什么。

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

    务实的方法是与 绑定列表<t> (可能继承自它)。这将向您提供所有列表通知,包括对项目的支持 在里面 如果实现,列表将更改 InotifyProperty已更改 在物品上(它不支持 *改变 尽管如此。

    警告:并非所有控件都关心通知…如果他们没有,你就没什么办法了。因此,即使在使用 绑定列表<t> -或者在实现时看不到项更新 InotifyProperty已更改 然后…呃,坚强吗?