0

我有一个 DataGridView,它在表中显示以下列的值

PK1, PK2, PK3, C1, C2, C3, C4
  1,   2,   3,  A,  B,  X,  Y
  4,   1,   4,  C,  D,  Z,  Y (Match the rows in the table below)
  2,   3,   5,  F,  E,  X,  W
  3,   1,   2,  A,  B,  X,  Y (Match the rows in the table below)
  ......

PK1, PK2, PK3是组合表的主键。给定 PK 的 DataTable(示例如下所示)。找到这些行的最佳方法是什么?

PK1, PK2, PK3
  4,   1,   4
  3,   1,   2

(迭代 DataGridView 单元格或下划线 DataSource?也许是单元格,因为我需要突出显示行中的一些单元格。性能考虑因素?)

4

2 回答 2

1

我会看一下DataGridView RowPrePaint 事件CellFormatting 事件CellPainting 事件,以实现突出显示。

为了匹配行,数据来自哪里很重要。如果它来自同一个数据库,您能否在返回数据的查询中进行匹配?您可以使用 Linq 对 DataTables 进行查询并找到匹配项。

另一个想法是在两个 DataTables 之间创建一个DataRelation 。请参阅靠近底部的DataTable Class页面上的示例。继续搜索MakeDataRelation以找到示例。DataRelations 可能真的很棘手,但是当你让它们工作时,它们真的很酷。

为了评估性能考虑,可能需要更多信息。数据从何而来?每个表有多少行数据,几个,10s,100s,1000s?您对数据源的设计有任何控制权吗?你能消除这个复合键并创建一个代理键吗?

如果您可以控制查询,则可以执行以下操作:

SELECT A.PK1, A.PK2, A.PK3, A.C1, A.C2, A.C3, 
       WHEN B.PK1 IS NULL THEN 0 ELSE 1 END AS OTHER
FROM TABLEA AS A
LEFT JOIN TABLEB AS B ON A.PK1 = B.PK1 AND A.PK2 = B.PK2 AND A.PK3 = B.PK3
WHERE <whatever other criteria you have for this query>

现在 DataTable 中的 OTHER 列将指示 TableB 是否有匹配项。您实际上并不需要该WHEN...END子句,您可以只放置B.PK1和处理 null 与一个值,假设它PK1永远不会有一个有效的 null 值。在您的应用程序中,不要显示该OTHER列,只需将其用作确定是否进行突出显示的值。

于 2012-11-17T08:03:25.837 回答
0

您可以定义DataTable.PrimaryKey()然后使用DataTable.Rows.Find().

首要的关键

查找数据行

处理数据表比 DataGridView 单元更有效。我建议在形成单元格之前要小心,请检查此 Using Cell Styles Efficiently

于 2016-01-08T07:00:30.793 回答