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

Winforms 如何在DataGridView中查找给定DataTable中存在哪些唯一标识符的行?,winforms,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)

我有一个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是表的组合主键。给定PKs的数据表,示例如下所示。找到这些行的最佳方法是什么

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

迭代DataGridView单元格或下划线数据源?可能是单元格,因为我需要突出显示行中的一些单元格。性能注意事项?

我想看一下,或者,来实现突出显示

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

另一个想法是在两个数据表之间创建一个连接。请参见页面底部附近的示例。搜索MakeDataRelation以查找示例。数据关系可能非常棘手,但当你让它们工作时,它们真的很酷

要评估性能注意事项,可能需要更多信息。数据来自哪里?每个表中有多少行数据,几行,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中的另一列将指示TableB是否匹配。您实际上不需要WHEN…END子句,您可以将B.PK1放在一起,处理null与一个值,假设PK1永远不会有null的有效值。在应用程序中,不显示另一列,只将其用作决定是否进行高亮显示的值。

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

处理datatable比处理DataGridView单元格更有效。我建议在形成细胞前要小心,检查这个
.

查找这些行的最佳方法是什么?哪一排?主键在哪里匹配?@Sami,是的,需要找到行并更改某些单元格的显示格式/样式。那么您给出的示例不正确?或者我一直没能让你明白我在问什么。因为在你给出的例子中,4,1,4不能匹配3,1,4。您正在进行什么类型的匹配?它们是两套PK。datagridview中的两行将被匹配,正如我在第一个表的右侧所写的那样。那你怎么办。假设第3行与第8、12、21行匹配,第6行仅与第15行匹配。你需要什么样的输出?您只需要第3行和第6行的pk1、pk2、pk3,还是需要所有匹配行的行?数据来自SQL Server。我正在向遗留应用程序添加一个功能。这个特性不是常用的特性,所以我不想更改数据源。我无法消除复合键并创建代理键。可能有10万排,还有几个问题。关于数据源,您是否可以控制查询?或者这两个数据表是作为一个存储过程中的一个数据集还是两个存储过程中的一个数据集返回的?100K行是要显示的大量行。这是SQL Server表中的行数,还是查询返回的“DataTable”中的行数?如何显示这些数据?在Windows窗体应用程序或ASP.NET web应用程序中?使用C、VB或其他语言?语言并不重要,但很高兴知道目标是什么。它来自两个存储过程。通常,栅格视图将显示10K行。在C.10K行中的WinForms仍然有很多数据要显示给用户,但还可以。我猜DataRelations将是解决这一问题的方法。我需要写一些测试代码,然后我将添加到我的答案中。