TcxGrid 常用属性与操作方法详解
获取当前行与列信息
在使用 TcxGrid 时,可通过以下属性获取焦点位置的相关数据:
TableView.Controller.FocusedRowIndex:返回当前选中行的索引(从0开始)。TableView.Controller.FocusedRow:获取当前聚焦的行对象。TableView.Controller.FocusedColumn:获取当前聚焦的列对象。TableView.Controller.FocusedColumnIndex:返回当前列的索引值。TableView.Controller.EditingItem:返回正在编辑的单元格项。TableView.Controller.EditingController.Edit:访问当前激活的编辑控件实例。
读取单元格值(区分编辑状态)
根据是否处于编辑模式,应采用不同方式获取单元格内容:
if cxGrid1DBTableView1.Controller.FocusedColumn.Editing then
ShowMessage(cxGrid1DBTableView1.Controller.EditingController.Edit.EditingValue)
else
ShowMessage(cxGrid1DBTableView1.DataController.Values[
cxGrid1DBTableView1.DataController.FocusedRecordIndex,
cxGrid1DBTableView1.Controller.FocusedItemIndex]);
通过 CellClick 事件获取点击单元格的值
利用 OnCellClick 事件捕获用户点击行为,并提取对应单元格的数据:
procedure TForm1.cxGrid1DBTableView1CellClick(
Sender: TcxCustomGridTableView;
ACellViewInfo: TcxGridTableDataCellViewInfo;
AButton: TMouseButton;
AShift: TShiftState;
var AHandled: Boolean);
var
ValueData: Variant;
begin
ValueData := ACellViewInfo.Value;
Clipboard.AsText := VarToStr(ValueData); // 自动复制到剪贴板
end;
访问指定行列的数据值
可通过索引直接读取某行某列的值:
// 获取当前选中列的索引
ColIndex := cxGrid1DBBandedTableView1.Controller.FocusedColumn.Index;
// 取得第一个选中行在该列的值
RowIdx := cxGrid1DBBandedTableView1.Controller.SelectedRows[0].RecordIndex;
CellValue := cxGrid1DBBandedTableView1.DataController.GetValue(RowIdx, ColIndex);
// 或使用简写语法
Value := cxGrid1DBTableView1.DataController.Values[RowIdx, ColIndex];
设置焦点到特定列
可编程方式将输入焦点移至某一列:
cxGrid1DBTableView1.Columns[5].FocusWithSelection; // 聚焦并选中
cxGrid1DBTableView1.Columns[4].Focused := True; // 仅设为焦点
统计与遍历选中行
获取当前选中的行数及每行数据:
// 获取选中行总数
SelectedCount := dgtv1.DataController.GetSelectedCount;
// 遍历所有选中行并输出第一列值
for I := 0 to SelectedCount - 1 do
begin
RowIndex := dgtv1.DataController.GetSelectedRowIndex(I);
ShowMessage(VarToStr(dgtv1.DataController.GetValue(RowIndex, 0)));
end;
获取排序条件构建 SQL ORDER BY 子句
动态读取表格当前排序规则:
const
SortOrderStr: array[soNone..soDescending] of string = ('None', 'ASC', 'DESC');
var
S, OrderClause: string;
I: Integer;
begin
OrderClause := '';
for I := 0 to dgtv1.SortedItemCount - 1 do
begin
if OrderClause <> '' then
OrderClause := OrderClause + ', ';
OrderClause := OrderClause +
dgtv1.SortedItems[I].DataBinding.DefaultCaption + ' ' +
SortOrderStr[TcxDataSortOrder(dgtv1.SortedItems[I].SortOrder)];
end;
if OrderClause <> '' then
ShowMessage('ORDER BY ' + OrderClause);
end;
多选状态下定位数据集记录
结合数据集(如 ADOQuery)跳转到每个选中行对应的位置:
for i := 0 to cxGrid1.SelectedRows.Count - 1 do
begin
cxGrid1.DataSource.DataSet.GotoBookmark(
Pointer(cxGrid1.SelectedRows.Items[i])
);
end;
结合数据集字段获取完整行信息
在循环选中行的同时访问原始数据字段:
with cxGrid1DBTableView1.Controller do
begin
for i := 0 to SelectedRowCount - 1 do
begin
SelectedRows[i].Focused := True;
ShowMessage(ADOQuery1.FieldByName('mc').AsString);
end;
end;