Что ваш обновленный q просят прямо и как обычно с материалом Devex, это все в OLH, пока вы можете найти свой путь в него.
способ найти, какие строки в настоящее время соответствует фильтру, чтобы использовать свойство
cxGrid1DBTableView1.DataController.FilteredRecordIndex[]
. Вы можете обнаружить, что запись в наборе данных, чтобы обработать его каким-то образом с помощью
cxGrid1DBTableView1.DataController.LocateByKey().
Update: Оригинальная версия этого ответа предполагается, что набор данных имел поле ID целое. Как утверждает OP, вместо этого он использует GUID, я обновил его соответствующим образом.
Предполагая TClientDataSet CDS1 имеет поле Guid: TGuidField, Имя: TStringField, размер 32 и отмеченный: TBooleanField и подключен к cxDBTableView, с включенной фильтрацией, из TcxGrid.
Убедитесь, что cxGrid1DBTableView1.DataController.KeyFieldNames установлен в 'Guid'.
Добавьте к форме обычный TDBGrid и укажите его в том же источнике данных, что и TcxGrid. Точка заключается в том, чтобы упростить проверку того, что код работает по мере необходимости.
Добавьте приведенный ниже код в блок, и точка OnColumnHeaderClick cxDBTableView1 по адресу обработчик 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;
Ime, лучший способ сделать это, чтобы включить «несвязанные» проверить столбец в сетке - это позволяет избежать накладных расходов на ведение .Edit/.Post, чтобы сохранить состояние выбора в поле данных набора данных. В Devex есть примеры того, как это сделать. – MartynA
Я не хочу использовать несвязанный столбец, так как отмеченные данные должны использоваться в другой операции, как только форма закрывается. Поэтому он должен быть привязан к полю в наборе данных. – OZ8HP
Нет, это необязательно должно быть связано - просто состояние выбора отдельных строк в наборе данных и их идентификаторы необходимо сохранить для следующей операции. В любом случае, если вы хотите сделать это по-своему, просто сделайте это - ответьте на щелчок в сетке, обновив любое интересующее вас поле. Но есть потенциальные ловушки для неосторожных, например. вы должны убедиться, что набор данных не проиндексирован в этом поле. – MartynA