使用主键在 DataView 中定位行

Posted

技术标签:

【中文标题】使用主键在 DataView 中定位行【英文标题】:Locating row in DataView using primary key 【发布时间】:2013-07-19 08:00:39 【问题描述】:

如何使用主键在 DataView 中定位 DataViewRow 的索引 不干扰当前排序顺序(不是主键)?

我有显示 DataView 内容的网格控件。在这排一排 网格被选中。当我必须更改排序时,我希望保留选中 新排序顺序下的行。所以,想法是获取选定的主键 设置新排序顺序之前的 DataViewRow 并找到相同的主 新排序顺序下的键。

目前,我必须手动搜索 DataView 以获取特定的主键。 有没有更好的方法来做到这一点?

使用索引位置而不是主键的解决方案也可以。

【问题讨论】:

【参考方案1】:

我想我找到了最合适的方法来解决这个问题,所以如果 任何人都对此感兴趣:

DataView 的 Find 方法使用当前排序顺序快速定位行。 问题在于排序键通常无法识别 每一行都有唯一的排序键。所以为了工作,我们必须 使排序键对每一行都是唯一的。这可能很简单 通过将主键添加到排序表达式的末尾来完成。 这样所有非唯一的排序键将额外 按主键排序,这将使排序键唯一 并同时保留排序顺序。这是一个例子:

假设我们已经加载了 DataTable:

id  last_name  first_name  date_of_birth
----------------------------------------
11  Rogers     Samuel      1968-08-17
12  Smith      John        1952-12-25
13  Johnson    Bob         1981-03-29
14  Smith      John        1977-02-08
15  Adams      David       1971-09-15
----------------------------------------

// set primary key for DataTable

table.PrimaryKey = new DataColumn[]  table.Columns[ "id" ] ;

// create first sorting order by last and first name
// but make sort unique by adding primary key at end

DataView view1 = new DataView( table );
view1.Sort = "last_name, first_name, id";

// create second sorting order by date of birth and again
// make sort unique by adding primary key at end

DataView view2 = new DataView( table );
view2.Sort = "date_of_birth, id";

// get DataRow of DataTable with primary key 14

DataRow row = table.Rows.Find( 14 );

// using data from DataRow find matching sort key

// be aware that Find method of DataView could return -1
// if DataView has filter set that hides row you search

int index_in_view1 = view1.Find( new Object[]  row[ "last_name" ],
                                                row[ "first_name" ],
                                                row[ "id" ]  );

int index_in_view2 = view2.Find( new Object[]  row[ "date_of_birth" ],
                                                row[ "id" ]  );

如果有人对此解决方案有任何异议,我真的会 有兴趣听听。

【讨论】:

以上是关于使用主键在 DataView 中定位行的主要内容,如果未能解决你的问题,请参考以下文章

在列上使用 SetOrdinal() 后如何更新 DataGridView

在DataTable和DataView中查找指定记录

如何使用唯一键而不是主键在 Hibernate 中检索记录

使用复合主键在联结表上设置外键约束

使用 char(17) 作为主键在 SQL Server 的表中存储 VIN 号如何影响性能? [关闭]

如何在Visual Basic 6.0中使用主键在一个表中使用外键获取记录