.net 将非集合对象用作数据源
一组dotnetframework组件使用一个数据源组件。 我有一个对象,它有许多设置,可以修改它所表示的数据源。我想将此对象设置为一组ComboBox和DataGridViewComboBoxCells的下拉数据源 我的问题是当我试图把东西挂到组合框中时。我想,因为一旦设置了数据源,数据源的更改就可能发生,所以我必须使用这些BindingSource中的一种,但是MSDN文献正在恶作剧地告诉我BindingSource是什么,而不告诉我它的功能或工作方式 你们能建议的将这个对象作为数据源/绑定源连接起来的最佳方式是什么 编辑:.net 将非集合对象用作数据源,.net,data-binding,bindingsource,.net,Data Binding,Bindingsource,一组dotnetframework组件使用一个数据源组件。 我有一个对象,它有许多设置,可以修改它所表示的数据源。我想将此对象设置为一组ComboBox和DataGridViewComboBoxCells的下拉数据源 我的问题是当我试图把东西挂到组合框中时。我想,因为一旦设置了数据源,数据源的更改就可能发生,所以我必须使用这些BindingSource中的一种,但是MSDN文献正在恶作剧地告诉我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
短版本:使用
BindingList
长版本:
数据源
通常是:
- 单个对象(用于简单绑定)
- 列表源(
)IListSource
- 列表(
)IList
IList
(IListSource
相对较少,除了DataTable
)
对于绑定后的更改,需要通知。对于简单绑定(单个对象),无论是INotifyPropertyChanged
还是*Changed
事件都是可行的-但是对于列表,您需要实现IBindingList
并引发ListChanged
事件来告诉控件发生了什么
老实说,这是很多很容易弄糟的无趣工作
实用的方法是使用BindingList
(可能继承自它)。这将为您提供所有列表通知,包括支持列表中的项目,如果您在项目上实现INotifyPropertyChanged
(但不支持*Changed
事件),则列表将发生更改
警告:并非所有控件都关心通知。。。如果他们不这么做,你也无能为力。因此,如果即使在使用
BindingList
时也看不到添加/交换/etc-或者在实现INotifyPropertyChanged
时看不到项目更新,那么。。。呃,难吗?一些示例代码会很好:)我本来认为它足够清楚,但我想那是因为我已经知道问题出在哪里了。;)我会把一些东西放在一起。啊,iBindingList存在于System.ComponentModel中,我没有直接连接到Intellisense。我已经看过了iBindingSource,它看起来仍然不可理解,可能与我正在寻找的完全无关。iBindingList是一个必须填写的非常好的实现,但它更像是我想要的。非常感谢。但有一件事,我不认为有一个iBindingEnumerable或类似的?我可能只是在我的iBindingList实现中有很多不活动的函数,这样人们就不能添加东西了,但是如果没有列表方法就好了……基本上没有。ASP.NET可以处理IEnumerable
,因为它只读取一次,但其他所有内容都希望能够多次获取数据,因此它使用IList上的索引器。更糟糕的是,您可能必须实现ITypedList-p(包括编写自己的PropertyDescriptor…)顺便说一句,IBindingList是除了实现(非通用)IList接口之外的另一个功能…哦,的确如此。VB为我输入了所有的方法声明,所以我没有注意到,但你是对的;iBindingList强制实现iList和iEnumerable。很遗憾没有iBindingList,但由于我不打算在列表操作函数的实现中添加任何代码,这是一个没有实际意义的问题。