2015-06-08 7 views
0

У меня есть cxGrid, где я применяю фильтр для выбора определенных записей. Когда это будет сделано, я хочу иметь возможность обновлять поле/столбец в сетке, чтобы отметить каждую запись, которая будет использоваться для следующей операции. Мне не удалось это выяснитьПронумеруйте записи на cxgrid и обновите поле/столбец

Возможно, я не был достаточно конкретным при описании моей проблемы. У меня есть cxGrid, где я применил фильтр, который выбирает некоторые записи. Что мне тогда нужно сделать, так это щелкнуть заголовок столбца, а затем для этих записей указать поле с именем fldselected set равным True.

+0

Ime, лучший способ сделать это, чтобы включить «несвязанные» проверить столбец в сетке - это позволяет избежать накладных расходов на ведение .Edit/.Post, чтобы сохранить состояние выбора в поле данных набора данных. В Devex есть примеры того, как это сделать. – MartynA

+0

Я не хочу использовать несвязанный столбец, так как отмеченные данные должны использоваться в другой операции, как только форма закрывается. Поэтому он должен быть привязан к полю в наборе данных. – OZ8HP

+0

Нет, это необязательно должно быть связано - просто состояние выбора отдельных строк в наборе данных и их идентификаторы необходимо сохранить для следующей операции. В любом случае, если вы хотите сделать это по-своему, просто сделайте это - ответьте на щелчок в сетке, обновив любое интересующее вас поле. Но есть потенциальные ловушки для неосторожных, например. вы должны убедиться, что набор данных не проиндексирован в этом поле. – MartynA

ответ

1

Что ваш обновленный 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; 
+0

Выглядит более многообещающе, но у моих данных нет целочисленного ID - у него есть строковое поле (GUID9, поэтому мне придется немного его изменить, и из-за времени он не будет раньше завтрашнего дня, но я вернусь. – OZ8HP

+0

Хорошо, я обновил свой ответ, чтобы использовать идентификаторы GUID вместо поля идентификатора целого числа. Протестировано с фильтрами в поле Name, например, Name> = 'D' – MartynA

+0

Большое спасибо - теперь у меня есть рабочее решение – OZ8HP

1

Отъезд https://www.devexpress.com/Support/Center/Question/Details/A1095, статья от Dev Express. Не позволяйте факту, что статье 11 лет, обманите вас. Та же техника по-прежнему применяется. И вы можете установить это либо в коде, либо в редакторе сетки.

  1. Создайте столбец в редакторе сетки.
  2. Установите столбцы DataBinding.ValueType в Boolean (если это то, что вы хотите, чтобы этот флажок был представлен)
  3. Задайте свойство KeyFieldNames контроллера Data Controller. Очень важно! Я потратил часы, царапая голову неработающим несвязанным столбцом, чтобы обнаружить, что KeyFieldNames не были установлены.

Несвязанный столбец можно ссылаться в следующей операции с использованием массива DataController Records или Values ​​в зависимости от того, как вы это настроили. Поскольку он не связан, вы не можете ссылаться на него через базовый DataSet.

Смежные вопросы