使用主键在DataView中查找行

时间:2013-07-19 21:59:41

标签: .net find primary-key dataview

如何使用主键在DataView中查找DataViewRow的索引
没有扰乱当前的排序顺序(这不是主键)?

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

目前,我必须手动搜索DataView以获取特定的主键 有更好的方法吗?

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

1 个答案:

答案 0 :(得分:0)

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

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" ] } );

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