我有一个 DataGridView,它有一些 DataSource。我需要根据用户指定的某些条件过滤 DataGridView 中的项目。
问题是数据在一个非常慢的数据库上。对于许多项目,我可以过滤存储在项目本身上的信息(这很快),但有时我需要查询数据库以确定一行是否可见。
因此,我通过以下方式使用 BackGroundWorker:
- 我制作了 DataGridView 中行的副本(使用CopyTo)并将其传递给RunWorkerAsync方法
- 在DoWork方法中,我检查数组中的每个DataGridViewRow元素。有时我可以简单地查找行中的信息(例如读取DataGridViewRow上的第 2 列),有时我需要查询数据库。
- 每次我知道一行是否可见时,我都会发送一个元组,其中包含一个行号(只是传递的DataGridViewRow元素数组中的位置)和一个指示ReportProgress方法可见性的布尔值,该方法将可见性设置为数据网格视图。
复制(使用 CopyTo)的原因是为了避免从另一个线程访问 DataGridViews RowCollection。
所有这一切都很好,但我真的想知道这是否是一个非常糟糕的方法。
- 像这样对 RowCollection 进行操作真的很糟糕吗?
- 如果可以的话,是否需要使用CopyTo?我这样做的原因是因为列表是通过引用传递的,我想避免从单独的线程访问 UI。
谢谢你的时间。