更新された q が求めていることは単純明快であり、Devex の場合と同様に、自分の道を見つけることができる限り、すべて OLH にあります。
フィルタに現在一致している行を見つける方法は、
cxGrid1DBTableView1.DataController.FilteredRecordIndex[]
財産。次に、データセットでそのレコードを見つけて、何らかの方法で処理することができます
cxGrid1DBTableView1.DataController.LocateByKey().
更新:この回答の元のバージョンでは、データセットに整数の ID フィールドがあると想定していました。OPが代わりにGUIDを使用していると述べたので、それに応じて更新しました。
TClientDataSet CDS1 にフィールド Guid : TGuidField、Name : TStringfield、サイズ 32 および Selected : TBooleanField があり、フィルタリングが有効な TcxGrid の cxDBTableView に接続されていると仮定します。
cxGrid1DBTableView1.DataController.KeyFieldNames が「Guid」に設定されていることを確認してください。
通常の TDBGrid をフォームに追加し、TcxGrid と同じデータソースをポイントします。これのポイントは、コードが必要に応じて機能していることを簡単に確認できるようにすることです。
以下のコードをユニットに追加し、ハンドラー cxGrid1DBTableView1ColumnHeaderClick で cxDBTableView1 の OnColumnHeaderClick をポイントし、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;