Winforms 如何从windows窗体获取特定的BindingSource?

Winforms 如何从windows窗体获取特定的BindingSource?,winforms,data-binding,Winforms,Data Binding,我正在开发一个具有选项卡式界面的维护windows窗体应用程序。表单中有3个绑定源(称为BindingSource1、BindingSource2、BindingSource3)。我正在尝试优化代码,并希望动态访问BindingSource,如下所示: objBindingSource=Ctype(Me.Controls(“BindingSource”+SelectedBindingSourceID),BindingSource) 我知道使用CType无法完成,因为无法将控件强制转换到Bindi

我正在开发一个具有选项卡式界面的维护windows窗体应用程序。表单中有3个绑定源(称为BindingSource1、BindingSource2、BindingSource3)。我正在尝试优化代码,并希望动态访问BindingSource,如下所示:

objBindingSource=Ctype(Me.Controls(“BindingSource”+SelectedBindingSourceID),BindingSource)

我知道使用CType无法完成,因为无法将控件强制转换到BindingSource中

任何关于如何实现这一点的想法都将非常好

谢谢


Raja

A
BindingSource
是一个
组件,而不是
控件,因此它不在
控件
集合中。但是,设计器会创建一个名为
components
的私有
IContainer
字段来保存表单上创建的所有组件,因此您可以通过该字段访问组件:

组件中每个c的
。组件
Show(c.ToString())
下一个
不幸的是,组件没有名称,因此您必须找到另一种方法来标识您的
BindingSource
。。。例如,如果您知道每个
BindingSource
都绑定到一个
DataTable
,则可以检查该表的名称

私有函数GetBindingSource(ByVal tableName作为字符串)作为BindingSource
对于组件中的每个c。组件
Dim bs As BindingSource=TryCast(c,BindingSource)
'如果组件是BindingSource
如果bs不是什么,那么
Dim dt As DataTable=TryCast(bs.DataSource,DataTable)
'如果数据源是DataTable
如果dt不是什么,那么
'对照参数检查表名
如果dt.TableName=TableName,则
“找到了!
返回bs
如果结束
如果结束
如果结束
下一个
'Oops,找不到BindingSource
一无所获
端函数

编辑:SO语法荧光笔似乎在VB上有问题…

就个人而言,如果只有三个BindingSource,为什么不直接访问它们而不是通过集合访问它们呢?如果只是对代码进行修饰,使其能够在循环中运行,我看不出有什么好处。但是,如果您想这样做,一种方法是在表单或UserControl的构造函数中初始化BindingSources(在InitializeComponents方法之外),然后手动将它们添加到Components集合中。这样做将允许您为Components集合中的BindingSource分配一个名称作为键。然后你可以像这样访问它们:(请原谅我的C#,我对VB不是那么流利,但你会得到jist)


这并不漂亮,但可能会对您有所帮助。

尽管这是一条很长的路线,但绝对值得探索……非常感谢:-)语法高亮显示器不识别VB,因为该问题没有VB标记。我添加了HTML注释:
来修复它。请参阅:。在分配实际数据源之前,
DataSource
属性有一个由WinForms designer分配的
Type
对象,当您使用对象绑定时,该对象指定绑定对象的类型(而不是其集合的类型)。因此,您可以使用它来标识正确的绑定源。
BindingSource bs1 = new BindingSource();
BindingSource bs2 = new BindingSource();
BindingSource bs3 = new BindingSource();

// set properties on BindingSources....

// add BindingSources to componenents collection manually.
// add a name key
components.Add(bs1, "BindingSource1");
components.Add(bs2, "BindingSource2");
components.Add(bs3, "BindingSource3");

// access the BindingSource
BindingSource bsSelected = components.Components["BindingSource" + SelectedBindingSourceID] as BindingSource;
if (bsSelected == null)
{
    throw new Exception("BindingSource" + 
                         SelectedBindingSourceID + " doesn't exist");
}