访问 DataController.Values 时一定要配合 RecordNum 使用(原创)

cxGrid 的 FocusedRecordIndexFocusedRowIndex 两个属性比较容易混淆,
RowIndex 是表格行的物理属性,是对表格中所有肉眼可见行的标记(包括数据行与分组后的组标题行),不论表中的数据行是否经过排序,标题行下第一行数据的RowIndex属性永远是 0,下一行的RowIndex是 1... ;对表格执行筛选操作后,只有可见行具有RowIndex
用个实例来说明的话,就是如果取得数据时张三在第一行,那么该行的RowIndex为 0;排序后李四排到了第 1 行,张三排在第 5 行,那么李四的RowIndex为0,张三的RowIndex为4。对于一个有10行数据的表,其RowIndex为 0-9,如果筛选后只显示6行数据,那么此时RowCount属性为6,RowIndex为0-5。
RecordIndex 是表格行的逻辑属性,即记录的是从数据集中取得数据时,每行数据在数据集中的位置(因此以 RecordIndex 命名)。初始化完成后,第一行数据的RecordIndex为 0,下一行的RecordIndex为 1...。如果对表格进行排序或筛选的话,RecordIndex是随着该行的位置移动同步的,也就是说,RecordIndex一直记录着该行在原始数据集中的行位置。写入RecordIndex值,可以将焦点行移动到筛选后不可见的数据行。
用个实例来说明的话,就是如果取得数据时张三在第一行,那么该行的RecordIndex为 0,李四在第三行,则该行的RecordIndex为 2;排序后李四排到了第 1 行,张三排在第 5 行,这时李四的RecordIndex仍然为 2,此时该行的RowIndex为 0;张三的RecordIndex仍然为 0,此时该行的RowIndex为 4。
查阅文档可以发现, DataController.Values 必须通过 RecordIndex 属性指定(严格地说,应该是在Bound数据绑定模式下),如果使用 FocusedRowIndex 来引用,也可以取得值,而且在未对表格进行排序或筛选时,使用 RecordIndex 和 RowIndex 会取得相同的值。需要警惕的是,一旦对表格排序或筛选后,再使用 FocusedRowIndex 来引用 Values 属性,所取得的值与实际的焦点行将不一致,这是个非常危险的错误!!

property Values[RecordIndex, ItemIndex: Integer]: Variant;

iRecordNum:= cvCustomerList.DataController.GetFocusedRecordIndex;
iFapiaoId := cvCustomerList.DataController.Values[iRecordNum, cvCustomerListId.Index];
posted @ 2024-10-19 16:23  汉学  阅读(42)  评论(0)    收藏  举报