如何在DataGridView中查找给定DataTable中存在唯一标识符的行?

时间:2012-11-17 07:05:40

标签: winforms

我有一个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?可能是单元格,因为我需要突出显示行中的一些单元格。性能考虑因素?)

2 个答案:

答案 0 :(得分:1)

我会看一下DataGridView RowPrePaint eventCellFormatting eventCellPainting event来实现突出显示。

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

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

要评估性能考虑因素,可能需要更多信息。数据来自哪里?每个表中有多少行数据,几个,10个,100个,1000个?您是否可以控制数据源的设计?你能否消除这个复合键并创建一个代理键?

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

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列,只需将其用作决定是否进行突出显示的值。

答案 1 :(得分:0)

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

PrimaryKey

Find a DataRow

使用datatable比DataGridView Cell更有效。我建议在形成细胞之前小心,检查一下 Using Cell Styles Efficiently