设置对象的 DataSource 属性时,啥时候使用类型与实例?

Posted

技术标签:

【中文标题】设置对象的 DataSource 属性时,啥时候使用类型与实例?【英文标题】:When setting the DataSource property of an object, when do you use a Type vs. an instance?设置对象的 DataSource 属性时,什么时候使用类型与实例? 【发布时间】:2014-10-11 16:33:16 【问题描述】:

问题

[...].DataSource 设置为对象的实例与类的类型有什么区别?我已经在我们的代码库中看到了这两种方法的使用,并且我试图弄清楚为什么在任何这些情况下它都是一种或另一种方法。

示例

怎么样

object1.DataSource = typeof(SomeClass);

不同于

object2.DataSource = getSomeObject();

进一步查询

另外,在第一种情况下,如果我将 DataSource 设置为类的类型,如果该类是基类会发生什么?数据绑定是否适用于仅存在于从基类派生的类中的属性?还是数据绑定只对我将DataSource 设置为的类的类型的类成员起作用?

我很难用我的Google 搜索查询来给我这个问题的答案。这要么是因为这些东西很复杂,我只是措辞不正确,要么是我不太了解 C# 中数据绑定的一些基础知识。我可以在这里获得一些帮助以指明正确的方向吗?谢谢!

【问题讨论】:

@MartinLiversage 你怎么知道这是winforms而不是其他一些UI范例? @Servy:问题的措辞让我很清楚这个问题是关于 Windows 窗体的,事实证明我是对的。如果您看到有关 C# 代码但没有语言标签的问题,您可能不会反对有人在其中编辑标签?在我自己没有写过的 SO 上编辑帖子很有挑战性,但我的目标是改进,而不是犯错误。如果我犯了一个错误,SO 的协作性质有望迅速撤销我所做的。 @Servy:请看我的回答。 [bindinglist] 标记和DataSource 属性以及您可以为DataSource 属性分配类型的事实。这很明显问题是关于System.Windows.Forms.BindingList.DataSource 属性的。在 WPF 或 ASP.NET 中没有可以在其中分配类型的具有该名称的属性。我做了一个问题的作者似乎同意的编辑,这让我有点困扰,你还想挑战这个编辑吗? @MartinLiversage 没有“绑定列表”标签。问题中没有提到“绑定列表”的使用,而不是具有DataSource 属性的任何其他类型。你是唯一一个提到过BindingList的人。我很担心,因为如果您习惯于在可能不适用该标签的问题中添加标签,那么您碰巧猜对了一次这一事实并不意味着您每隔一次就会猜对进行此类编辑,添加错误的范例标签可能会产生严重的负面后果。 @Servy:对不起,我在评论中打错了。请将“bindinglist”替换为“bindingsource”。希望那时它更有意义。如果您认为我在问题中添加了错误的标签,请告诉我,以便我从错误中吸取教训。但是,在我看来,只是暗示我定期这样做并不是很有建设性。 【参考方案1】:

当您将BindingSource.DataSource 属性设置为一种类型时,控件将绑定到具有该类型元素的空IBindingList。因此,数据源最初将没有项目。另一方面,如果您将 DataSource 设置为项目集合,则数据源将绑定到带有这些项目的 IBindingList

因此,分配一个类型会给你一个空的项目列表,而分配一个集合会给你一个包含集合中项目的列表。

如果您分配一个基本类型,您会得到一个基本类型项目的空列表。数据绑定不“知道”任何派生类。

【讨论】:

或者你得到一个异常:数据源是一个无效的类型。它必须是 IListSource、IEnumerable 或 IDataSource。 您的答案是否仅适用于设置控件的数据源?我遇到过我们“新建”BindingSource 对象并设置该对象的DataSource 属性的地方,而不是直接转到控件本身的DataSource。对不起,如果这是一个愚蠢的问题...... @JakeSmith:我指的是BindingSource 类。我不确定所有控件是否一定会在其特定的DataSource 属性中实现相同的行为。 好的,太好了!所以真正的想法是,将DataSource 设置为一个类型将帮助您使用 Visual Studio 设计器界面做出数据绑定决策,而不是编写一堆代码并且必须运行/调试它以查看它是否正确完成?然后就像你说的那样,在某些时候,必须为 DataSource 提供所述类型的实际实例。【参考方案2】:

如果您将数据源设置为一种类型,您可以定义稍后将处理的类型。这将有助于将该对象的属性绑定到设计器中的元素。

需要在稍后阶段设置值来定义实际显示的数据。

编辑: 而且您只能访问您正在处理的类上的属性,而不能访问任何父类。

【讨论】:

以上是关于设置对象的 DataSource 属性时,啥时候使用类型与实例?的主要内容,如果未能解决你的问题,请参考以下文章

创建在类路径资源[applicationcontext]中定义名为“工厂”的bean时出错。:在设置bean属性“dataSource”时,无法解析对bean“dataSource”的引用;嵌套异常是

java datasource啥模式

函数对象在啥时候具有属性?

String对象length属性怎么使用有啥功能

我啥时候应该将 layer.shouldRasterize 设置为 YES

我啥时候可以开始使用使用 UIAppearance 设置的属性?