gpt4 book ai didi

.net - 什么时候值得使用 BindingSource?

转载 作者:行者123 更新时间:2023-12-03 08:58:50 25 4
gpt4 key购买 nike

我想我很了解 BindingSource 类的作用——即在数据源和 UI 控件之间提供一层间接。它实现了 IBindingList 接口(interface),因此还提供了对排序的支持。而且我已经使用它足够频繁,没有太多问题。但我想知道我是否经常使用它。也许一个例子会有所帮助。

假设我在表单上只有一个简单的文本框(使用 WinForms),我想将该文本框绑定(bind)到返回字符串的类中的一个简单属性。在这种情况下是否值得使用 BindingSource?

现在假设我的表单上有一个网格,我想将它绑定(bind)到一个 DataTable。我现在应该使用 BindingSource 吗?

在后一种情况下,我可能不会使用 BindingSource,因为我可以收集到的数据表提供与 BindingSource 本身相同的功能。当添加、删除行等时,DataTable 将触发正确的事件,以便网格自动更新。

但在文本框绑定(bind)到字符串的第一种情况下,我可能会让包含字符串属性的类实现 INotifyPropertyChanged,以便在字符串更改时触发 PropertyChanged 事件。我将使用 BindingSource 以便它可以监听这些 PropertyChanged 事件,以便在字符串更改时自动更新文本框。

到目前为止听起来如何?我仍然觉得我的理解存在差距,这使我无法看到整个画面。到目前为止,这是一个相当模糊的问题,所以我会尝试提出一些更具体的问题——理想情况下,答案将引用上述示例或类似的东西......

(1) 在上述任何一个示例中都值得使用 BindingSource 吗?

(2) 似乎开发人员只是“假设”DataTable 类会做正确的事情,在正确的时间触发 PropertyChanged 事件。如何知道数据源是否能够做到这一点?为了让开发人员能够承担这种行为,数据源是否应该实现特定的接口(interface)?

(3) 在考虑是否使用 BindingSource 时,绑定(bind)什么 Control 是否重要?还是只有数据源会影响决策?也许答案是(这似乎很合乎逻辑):控件需要足够智能以监听 PropertyChanged 事件,否则需要 BindingSource。那么如何判断 Control 是否有能力做到这一点呢?同样,开发人员是否可以寻找控件必须实现的特定接口(interface)?

过去,正是这种困惑导致我总是使用 BindingSource。但我想更好地了解何时使用一个,以便我只在必要时这样做。

最佳答案

很老的问题。奇怪为什么到现在还没有人回答。好的,我会尝试分享我的经验。
BindingSource 不仅仅是将控件绑定(bind)到集合的一种方式。在 WinForms 工作了十多年后,我最喜欢的 BindingSource 的最佳特性包括:

  • 绑定(bind)(当然!)
  • 货币管理(我稍后会谈到)
  • BindingSource 可以充当另一个 BindingSource 数据源

  • 为了充分了解这些特性,我将在 DataSet 的上下文中对其进行解释,这是迄今为止 WinForms 中使用的最常见的数据源类型,尤其是在业务线应用程序中。

    货币管理归结为 当前记录 的概念。 DataTable 只是 DataRow 的集合,即 DataTables 中没有当前记录的概念。 DataView 的情况也是如此(顺便说一句,您不能直接绑定(bind)到 DataTable ;当您这样做时,它实际上绑定(bind)到 DefaultViewDataTable 属性,即 DataView 。您也可以创建自己的 DataView )。

    在 Master/Detail 类型的 UI 中,货币管理确实很方便。因此,假设您在左 Pane (主)中有一个 ListBox 的学生,在右 Pane 中有几个文本框、组合框、复选框等,并带有一个选定学生类(class)的网格(详细信息)。在您的数据集中,您有两个名为 StudentCourses 的数据表。为了简单起见,我在这里避免使用动名词(Student_Course)。 Course 表有一个外键 StudentID 。这是您在此处设置绑定(bind)的方式(请注意我上面列出的所有 3 个功能如何在下面的设置中使用):
  • 在表单中添加两个 BindingSource 控件,分别命名为 bsStudentbsCourses
  • DataSourcebsStudent 设置为 Student 数据表。
  • DataSourcebsCourses设置为bsStudent!
  • DataMember 属性中,您将看到存在于我们两个表之间的 DataSet 中的关系的名称。选择它!
  • 将单个原子控件的绑定(bind)设置为 bsStudent 的属性。
  • 设置类(class)网格 bsCourses 的 DataSource

  • 你完成了。无需编写任何代码(可以这么说),您就成功地创建了主从 View 。 BindingSource 控件现在将处理学生列表中的当前记录,不仅更新原子控件(文本框、组合框等),还更新类(class)网格,这将自动更新其内容以显示当前所选学生的类(class)。

    我的 friend ,这就是我最喜欢的 BindingSource 的作用(以及其他不错的功能,如排序、过滤等)。如果在控件和数据存储之间不涉及 BindingSource,您将没有当前记录的概念,因此必须手动管理使所有 UI 保持同步。

    关于.net - 什么时候值得使用 BindingSource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3042474/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com