Как получить значения Id для смежных записей в TcxGrid (TcxGridDBTableView) - PullRequest
0 голосов
/ 31 октября 2019

У меня есть DevExpress cxGrid, и я хотел бы получить идентификаторы смежных записей. Я могу использовать их в следующем случае: пользователь удаляет сфокусированную запись, и я помещаю курсор (вид сетки) на одну из смежных записей (как определено, но текущий порядок сортировки и группировки вида сетки). В противном случае положение курсора сетки плохо определяется после удаления записи и после обновления вида сетки.

Я сделал следующие попытки, но они не работают - значения Id являются нежелательными:

procedure GetAdjacentRecordIds(AView: TcxGridDBTableView; ACdFieldName: string; var APrevId, AId, ANextId: Integer);
var Item: TcxCustomGridTableItem;
    RecIdx: Integer;
    i, RecCount: Integer;
begin
  APrevId:=-1;
  AId:=-1;
  ANextId:=-1;

  if Trim(AIdFieldName)='' then Exit;
  if not Assigned(AView) then Exit;
  if not Assigned(AView.DataController) then Exit;

  Item:=AView.DataController.GetItemByFieldName(UpperCase(AIdFieldName));
  if not Assigned(Item) then Exit;

  {//First attempt, didn't work, AId was the right one, but APrevId and ANextId were junk
  RecIdx:=AView.DataController.FocusedRecordIndex;
  AId:=AView.DataController.Values[RecIdx, Item.Index];
  APrevId:=AView.DataController.Values[RecIdx-1, Item.Index];
  ANextId:=AView.DataController.Values[RecIdx+1, Item.Index];}

  //Second attempt, doesn't work, all three Ids are junk
  RecIdx:=-1;
  RecCount:=AView.ViewData.RecordCount;
  for i:=0 to RecCount-1 do begin
    if AView.ViewData.Records[i].Focused then begin
      RecIdx:=1;
      Break;
    end;
  end;
  if RecIdx<0 then Exit;

  AId:=AView.ViewData.Records[RecIdx].Values[Item.Index];
  if RecIdx>0 then
    APrevId:=AView.ViewData.Records[RecIdx-1].Values[Item.Index];
  if RecIdx<RecCount then
    ANextId:=AView.ViewData.Records[RecIdx+1].Values[Item.Index];
end;

Как я могу исправить этот код, чтобы получить значения полей для соседних записей. Или, может быть, я должен использовать Grid-навигатор и сделать предыдущий / следующий на нем, но я хотел бы найти значения в невидимыхА DataSet.DisableControls может остановить Grid-навигатор?

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Использование навигационных функций DataSet не является решением, поскольку CxGrid может иметь совершенно другой порядок сортировки. Но навигация по DataController - хорошее решение, и визуальное мерцание также отсутствует. Итак, решение:

  RecIdx:=AView.DataController.FocusedRecordIndex;
  AId:=AView.DataController.Values[RecIdx, Item.Index];
  if not AView.DataController.IsBOF then begin
    AView.DataController.GotoPrev;
    RecIdx:=AView.DataController.FocusedRecordIndex;
    APrevId:=AView.DataController.Values[RecIdx, Item.Index];
    AView.DataController.GotoNext;
  end;
  if not AView.DataController.IsEOF then begin
    AView.DataController.GotoNext;
    RecIdx:=AView.DataController.FocusedRecordIndex;
    ANextId:=AView.DataController.Values[RecIdx, Item.Index];
    AView.DataController.GotoPrev;
  end;
0 голосов
/ 31 октября 2019

Я использовал базу знаний DevExpress, чтобы найти этот ответ. Вы неправильно ссылаетесь на внутреннее хранилище сетки. Вы также можете использовать dataset.previous и dataset.next для позиционирования указателя записи в связанной сетке и просто использовать dataset.fieldbyname(AidFieldName).AsInteger для получения ключевых значений.

get-cell-value-by-columnимя

procedure TForm1.Button1Click(Sender: TObject);  
var  
  AColumn: TcxGridDBColumn;  
  I: Integer;  
  AView: TcxGridDBTableView;  
  v: Variant;  
begin  
 AView := cxGrid1DBTableView1;  
 AColumn := TcxGridDBColumn( AView.FindItemByName('cxGrid1DBTableView1Capital'));  
 if Assigned(AColumn) then  
   for I := 0 to  AView.ViewData.RowCount - 1 do  
     v := AView.DataController.Values[AView.ViewData.Rows[0].RecordIndex, AColumn.Index];  
end;
...