15

我可以通过设置 DataSource 属性直接将我的 DataGridView 控件绑定到我的业务对象的绑定列表。我的业务对象实现了 INotifyPropertyChanged,因此当将新项目添加到绑定列表或更新现有项目时,DGV 会得到更新。

关于处理单个记录,我可以将我的业务对象绑定到文本框和其他相关控件。

我还可以从 BindingList 派生并创建一个 CustomBindingList 类来实现 IBindable 所需的方法,如下面的链接中所述:http: //msdn.microsoft.com/en-us/library/aa480736.aspx

或者,我看到人们推荐使用 BindingSource。BindingSource 的Datasource 是业务对象,DGV 的DataSource 是BindingSource。

无论如何,基于 BindingSource 并不能提供给我:

  1. 过滤(过滤器不起作用)。实施需要由我提供。
  2. 排序和搜索不起作用。实施需要由我提供。

那么,为什么推荐使用 BindingSource 方法呢?

更广泛的情况:我不熟悉 OOPS 概念和 C#。使用数据库应用程序。窗体。到目前为止只使用了DataSet/DataTable 的方法。现在尝试创建和使用我自己的自定义类。

通常有一个主/明细表。当我单击 DGV 中的详细信息行时,我想在单独的窗口中编辑该记录。因此,我需要获取 DGV 中该行表示的列表项的句柄。试图为此找到解决方案让我想到了这一点和这个疑问。

鉴于我想做什么,哪种方法更好,为什么?

这里的一些指针真的很有帮助,因为我对此很陌生。

4

3 回答 3

3

当窗体上的多个控件使用相同的数据源时,建议使用 BindingSource(幕后:Windows 窗体数据绑定的改进

设计时:当数据绑定到控件时,我个人发现 BindingSource 在从我的业务对象中选择属性时非常有帮助。

要获取当前选定行的句柄,请尝试 bindingSource1.Current as MyBusinessObject;

至于过滤和搜索:我对已实现的网格使用第三方 dll。所以不能帮你,抱歉。

当您使用不同类型业务对象的列表时,不要直接使用该列表

List<IAnimal> animals = new List<IAnimal>();
animals.Add(new Cat());
animals.Add(new Dog());
bindingSource1.DataSource = animals;

而是使用这样的 BindingList:

bindingSource1.DataSource = new BindingList<IAnimal>(animals);

这将确保列表中所有访问的对象都是 IAnimal 类型,并为您节省一些例外情况。

于 2012-04-23T22:18:48.687 回答
1

在处理仅显示一部分的大型集合时,绑定到 DataSource 可以为您带来好处。例如,如果您在这里查看 Telerik ListView http://www.telerik.com/help/winforms/listview-databinding.html(这些组件包有很多,这只是我正在使用的最新一个从)。

该视图非常轻量级,可让您的滚动位置确定哪些对象需要实际显示。因此,如果您只查看前 10 个对象并且从不向下滚动,则只有 10 个被绑定和显示。这可能会避免大量不需要的数据访问。

它们的 GridView 功能相同。网格的显示部分与潜在的巨大底层网格分开。

作为奖励,您可以进行过滤、排序和分组。

于 2012-05-11T01:44:54.610 回答
-2

据我所知,如果您正在使用数据库,则在中间使用bindingSource以在数据库和控件之间建立双边桥梁。否则,您可以只使用bindingList作为控件的源。

于 2014-01-15T04:04:45.373 回答