我有一个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?可能是单元格,因为我需要突出显示行中的一些单元格。性能考虑因素?)
答案 0 :(得分:1)
我会看一下DataGridView RowPrePaint event,CellFormatting event或CellPainting 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()
。
使用datatable比DataGridView Cell更有效。我建议在形成细胞之前小心,检查一下 Using Cell Styles Efficiently