我有一个 cxGrid,我在其中应用过滤器来选择某些记录。完成后,我希望能够更新网格中的字段/列以标记要用于下一个操作的每条记录。我无法弄清楚这一点
也许我在描述我的问题时不够具体。我有 cxGrid,我在其中应用了过滤器来选择一些记录。然后我需要做的是单击列标题,然后将这些记录的名为 fldselected 的字段设置为 True。
我有一个 cxGrid,我在其中应用过滤器来选择某些记录。完成后,我希望能够更新网格中的字段/列以标记要用于下一个操作的每条记录。我无法弄清楚这一点
也许我在描述我的问题时不够具体。我有 cxGrid,我在其中应用了过滤器来选择一些记录。然后我需要做的是单击列标题,然后将这些记录的名为 fldselected 的字段设置为 True。
您更新的 q 所要求的内容很简单,并且与 Devex 的东西一样,只要您能找到进入它的方式,它就在 OLH 中。
查找当前与过滤器匹配的行的一种方法是使用
cxGrid1DBTableView1.DataController.FilteredRecordIndex[]
财产。然后,您可以在数据集中找到该记录,以使用某种方式对其进行处理
cxGrid1DBTableView1.DataController.LocateByKey().
更新:这个答案的原始版本假设数据集有一个整数 ID 字段。正如 OP 所说,他改用 GUID,我已经相应地更新了它。
假设 TClientDataSet CDS1 具有字段 Guid:TGuidField、Name:TStringfield、大小 32 和 Selected:TBoleanField,并连接到 TcxGrid 的启用过滤的 cxDBTableView。
确保 cxGrid1DBTableView1.DataController.KeyFieldNames 设置为“Guid”。
将常规 TDBGrid 添加到表单并将其指向与 TcxGrid 相同的数据源。这样做的目的是使验证代码是否按要求工作变得容易。
将下面的代码添加到单元中,并将cxDBTableView1的OnColumnHeaderClick指向处理程序cxGrid1DBTableView1ColumnHeaderClick,并将表单的OnCreate指向FormCreate。
编译并运行
代码:
procedure TForm1.cxGrid1DBTableView1ColumnHeaderClick(Sender: TcxGridTableView;
AColumn: TcxGridColumn);
begin
if AColumn = cxGrid1DBTableView1Name then
ProcessFilteredRecords;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
AGuid : TGuid;
i : Integer;
lResult : Longint;
begin
CDS1.IndexFieldNames := 'Name';
CDS1.CreateDataSet;
for i:= 0 to 6 do begin
lResult := SysUtils.CreateGUID(AGuid);
CDS1.Insert;
CDS1.FieldByName('Name').AsString := Chr(Ord('A') + i);
CDS1.FieldByName('Guid').AsString := GuidToString(AGuid);
CDS1.FieldByName('Selected').AsBoolean := False;
CDS1.Post;
end;
CDS1.First;
end;
procedure TForm1.ProcessFilteredRecords;
var
V : Variant;
i,
Index: Integer;
BM : TBookMark;
begin
BM := CDS1.GetBookMark;
CDS1.DisableControls;
try
for i := 0 to cxGrid1DBTableView1.DataController.FilteredRecordCount - 1 do begin
Index := cxGrid1DBTableView1.DataController.FilteredRecordIndex[i];
// Next, get the GUID value of the row
V := cxGrid1DBTableView1.DataController.Values[Index, 0];
if cxGrid1DBTableView1.DataController.LocateByKey(V) then begin
CDS1.Edit;
CDS1.FieldByName('Selected').AsBoolean := True;
CDS1.Post;
end;
end;
finally
CDS1.EnableControls;
CDS1.GotoBookmark(BM);
CDS1.FreeBookmark(BM);
end;
end;
查看来自 Dev Express 的文章https://www.devexpress.com/Support/Center/Question/Details/A1095 。不要让这篇文章是 11 岁的事实欺骗了你。同样的技术仍然适用。您可以在代码或网格编辑器中进行设置。
在您的下一个操作中,可以使用 DataController Records 或 Values 数组引用未绑定的列,具体取决于您的设置方式。因为它是未绑定的,所以您无法通过底层 DataSet 引用它。