1

我有一个 DataGridView,它有一些 DataSource。我需要根据用户指定的某些条件过滤 DataGridView 中的项目。

问题是数据在一个非常慢的数据库上。对于许多项目,我可以过滤存储在项目本身上的信息(这很快),但有时我需要查询数据库以确定一行是否可见。

因此,我通过以下方式使用 BackGroundWorker:

  1. 我制作了 DataGridView 中行的副本(使用CopyTo)并将其传递给RunWorkerAsync方法
  2. DoWork方法中,我检查数组中的每个DataGridViewRow元素。有时我可以简单地查找行中的信息(例如读取DataGridViewRow上的第 2 列),有时我需要查询数据库。
  3. 每次我知道一行是否可见时,我都会发送一个元组,其中包含一个行号(只是传递的DataGridViewRow元素数组中的位置)和一个指示ReportProgress方法可见性的布尔值,该方法将可见性设置为数据网格视图。

复制(使用 CopyTo)的原因是为了避免从另一个线程访问 DataGridViews RowCollection。

所有这一切都很好,但我真的想知道这是否是一个非常糟糕的方法。

  • 像这样对 RowCollection 进行操作真的很糟糕吗?
  • 如果可以的话,是否需要使用CopyTo?我这样做的原因是因为列表是通过引用传递的,我想避免从单独的线程访问 UI。

谢谢你的时间。

4

1 回答 1

1

我认为您的 GUI 对于后台工作人员的数据库来说太紧了。

一般来说,我更喜欢使用BindingList<T>将网格绑定到并操作列表,而不是通过数据库。但是如果我有相当大量的数据要从数据库中检索,那么我可能会启用 datagridview 的“虚拟模式”,然后再次使用BindingList<T>.

希望这可以帮助。

EDIT1:当然你可以直接在你的DataTables上使用过滤......但也许你不应该让后台工作人员参与进来。

EDIT2:我认为BindingList<T>有机会将视图绑定到模型,而不是直接绑定到数据层,这通常更好,因为将表示层的数据层分开。更重要的是,您可以从模型创建一个视图模型以将网格绑定到(MVVM 模式)。但真的取决于你的项目。

于 2012-06-06T16:03:25.200 回答