一堆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
答案 0 :(得分:3)
简短版:使用BindingList<T>
...
长版:
DataSource
通常是:
IListSource
)IList
)由于您将其用于下拉列表,因此您会想要其中的第二个,通常IList
(IListSource
相对较少,DataTable
除外)。
对于一旦绑定后的更改,您需要通知。对于简单绑定(单个对象),INotifyPropertyChanged
或*Changed
事件是可行的方法 - 但对于列表,您需要实现IBindingList
并引发ListChanged
事件以告知控制发生了什么。
老实说,这是很多非有趣的工作,很容易搞得一团糟。
实用的方法是使用BindingList<T>
(可能继承自它)。这为您提供了所有列表通知,包括对项目中 项目的支持,如果您对项目实施INotifyPropertyChanged
(但它不支持*Changed
事件)。
警告:并非所有控制都关心通知......如果没有,那么你可以做很多事情。因此,如果您在使用BindingList<T>
时没有看到添加/交换/等等 - 或者在实施INotifyPropertyChanged
时没有看到项目更新,那么......呃,强硬吗?