如何使用主键在DataView中查找DataViewRow的索引
没有扰乱当前的排序顺序(这不是主键)?
我有网格控件,显示DataView的内容。这一行中的一行
网格被选中。当我必须改变排序时,我希望保留选择的
新排序下的行。所以,想法是获得所选的主键
设置新排序顺序之前的DataViewRow并找到相同的主要
新排序下的密钥。
目前,我必须手动搜索DataView以获取特定的主键 有更好的方法吗?
使用索引位置而不是主键的解决方案也可以。
答案 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" ] } );
如果有人对此解决方案有任何异议,我会真的 有兴趣听。