从BackGroundWorker正确设置DataGridView中条目的可见性

时间:2012-06-06 14:47:47

标签: c# datagridview backgroundworker

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

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

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

  1. 我在DataGridView中复制(使用 CopyTo )行并将其传递给 RunWorkerAsync 方法
  2. DoWork 方法中,我检查数组中的每个 DataGridViewRow 元素。有时我可以简单地查找行中的信息(例如,阅读 DataGridViewRow 上的第2列),有时我需要查询数据库。
  3. 每当我知道一行是否应该可见时,我发送一个由行号组成的元组(简单地说是 DataGridViewRow 元素的传递数组中的位置)和一个表示可见性的布尔值到 ReportProgress 方法,该方法设置DataGridView的可见性。
  4. 复制(使用CopyTo)的原因是为了避免从另一个线程访问DataGridViews RowCollection。

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

    • 在像这样的RowCollection上操作是一个非常糟糕的做法吗?
    • 如果没问题,是否有必要使用CopyTo?我这样做的原因是因为列表是通过引用传递的,我想避免从单独的线程访问UI。

    感谢您的时间。

1 个答案:

答案 0 :(得分:1)

我认为你的GUI对于后台工作者来说太紧张了。

一般情况下,我更喜欢使用BindingList<T>将网格绑定到,并操纵列表而不是通过数据库。但是如果我从数据库中检索到相当大量的数据,那么我可以启用datagridview的“虚拟模式”,并再次使用BindingList<T>

希望这有帮助。

EDIT1:当然,您可以直接使用DataTables进行过滤......但是,您可能不应该让后台工作人员参与进来。

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