【问题标题】:Locating row in DataView using primary key使用主键在 DataView 中定位行
【发布时间】:2013-07-19 08:00:39
【问题描述】:
如何使用主键在 DataView 中定位 DataViewRow 的索引
不干扰当前排序顺序(不是主键)?
我有显示 DataView 内容的网格控件。在这排一排
网格被选中。当我必须更改排序时,我希望保留选中
新排序顺序下的行。所以,想法是获取选定的主键
设置新排序顺序之前的 DataViewRow 并找到相同的主
新排序顺序下的键。
目前,我必须手动搜索 DataView 以获取特定的主键。
有没有更好的方法来做到这一点?
使用索引位置而不是主键的解决方案也可以。
【问题讨论】:
标签:
.net
find
primary-key
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" ] } );
如果有人对此解决方案有任何异议,我真的会
有兴趣听听。