1

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

我的问题是在尝试将事物实际挂钩到 ComboBox 时出现。我猜是因为一旦设置了 DataSource 就会发生对 DataSource 的更改,我必须使用这些 BindingSource 之一,但是 MSDN 文献正在拉扯它通常的恶作剧,即告诉我什么是 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
4

1 回答 1

3

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

长版:

ADataSource通常是:

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

由于您将它用于下拉菜单,因此听起来您通常需要后两个之一IListIListSource相对罕见,除了DataTable)。

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

老实说,这是很多毫无趣味的工作,很容易搞砸。

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

警告:并非所有控件都关心通知......如果他们不关心,你就无能为力了。因此,如果您即使在使用时也没有看到添加/交换/等BindingList<T>- 或者您在实施时没有看到项目更新INotifyPropertyChanged,那么......呃,很难吗?

于 2009-06-24T12:20:03.413 回答