gpt4 book ai didi

delphi - 循环遍历 cxgrid 上的记录并更新字段/列

转载 作者:行者123 更新时间:2023-12-02 02:26:59 25 4
gpt4 key购买 nike

我有一个 cxGrid,我在其中应用过滤器来选择某些记录。完成后,我希望能够更新网格中的字段/列来标记要用于下一个操作的每条记录。我一直没能弄清楚这个问题

也许我在描述我的问题时不够具体。我有 cxGrid,我在其中应用了选择一些记录的过滤器。然后我需要做的是单击列标题,然后将这些记录的名为 fldselected 的字段设置为 True。

最佳答案

您更新后的 q 要求的内容很简单,与 Devex 的东西一样,它是只要您能找到进入其中的方法,一切都在 OLH 中。

查找当前与过滤器匹配的行的一种方法是使用

cxGrid1DBTableView1.DataController.FilteredRecordIndex[]

属性(property)。然后,您可以在数据集中找到该记录,并使用

cxGrid1DBTableView1.DataController.LocateByKey().

更新:此答案的原始版本假设数据集具有整数 ID 字段。正如OP所说他使用GUID来代替,我已经相应地更新了它。

假设 TClientDataSet CDS1 具有字段 Guid:TGuidField,名称:TStringfield,大小 32和 Selected : TBooleanField 并连接到TcxGrid 的启用了过滤的 cxDBTableView。

  • 确保 cxGrid1DBTableView1.DataController.KeyFieldNames 设置为“Guid”。

  • 将常规 TDBGrid 添加到表单并将其指向与 TcxGrid 相同的数据源。重点这样做是为了轻松验证代码是否按要求工作。

  • 将下面的代码添加到单元中,并将cxDBTableView1的OnColumnHeaderClick指向处理程序 cxGrid1DBTableView1ColumnHeaderClick 以及 FormCreate 中的表单 OnCreate。

编译并运行

代码:

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;

关于delphi - 循环遍历 cxgrid 上的记录并更新字段/列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30712404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com