我有一个cxGrid,我在其中应用过滤器来选择某些记录。完成后,我希望能够更新网格中的字段/列,以标记将用于下一个操作的每个记录。 我无法弄明白
在描述我的问题时,也许我还不够具体。 我有cxGrid我已应用过滤器选择一些记录。 然后我需要做的是单击一个列标题,然后为这些记录设置一个名为fldselected的字段设置为True。
答案 0 :(得分:1)
查看Dev Express的文章https://www.devexpress.com/Support/Center/Question/Details/A1095。不要让这篇文章11岁的事实愚弄你。同样的技术仍然适用。您可以在代码中或在网格编辑器中设置它。
使用DataController记录或值数组,可以在下一个操作中引用未绑定列,具体取决于您设置的方式。因为它是未绑定的,所以你不能通过底层的DataSet引用它。
答案 1 :(得分:1)
你所更新的q要求的是直截了当的,和往常一样,有Devex的东西,它是 所有人都在OLH,只要你能找到进入它的方式。
查找当前与过滤器匹配的行的方法是使用
cxGrid1DBTableView1.DataController.FilteredRecordIndex[]
属性。然后,您可以在数据集中找到该记录,以使用
以某种方式处理它cxGrid1DBTableView1.DataController.LocateByKey().
更新:此答案的原始版本假设数据集具有整数ID字段。 由于OP已经说他使用了GUID,我已经相应地更新了它。
假设TClientDataSet CDS1有字段Guid:TGuidField,Name:TStringfield,size 32 和选中:TBooleanField并连接到 启用了过滤的cxxTableView,即TcxGrid。
确保将cxGrid1DBTableView1.DataController.KeyFieldNames设置为' Guid'。
将常规TDBGrid添加到表单并将其指向与TcxGrid相同的数据源。关键点 这样可以很容易地验证代码是否按要求运行。
将以下代码添加到设备中,并指向cxDBTableView1的OnColumnHeaderClick at 处理程序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;