【问题标题】:How to get Id values for the adjacent records in TcxGrid (TcxGridDBTableView)如何获取 TcxGrid (TcxGridDBTableView) 中相邻记录的 Id 值
【发布时间】:2019-10-31 08:38:43
【问题描述】:

我有 DevExpress cxGrid,我想获取相邻记录的 ID。我可以在以下用例中使用它们:用户删除焦点记录并将(网格视图)光标定位在相邻记录之一上(确定但网格视图的当前排序和分组顺序)。否则在删除记录和刷新网格视图后,网格光标的位置很难确定。

我进行了以下尝试,但它们不起作用 - 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 navigator 并在其上执行 prev/next,但我想找到不可见的值。并且 DataSet.DisableControls 可能会停止 Grid navigator?

【问题讨论】:

    标签: delphi devexpress delphi-2009 tcxgrid


    【解决方案1】:

    我使用 DevExpress 知识库来找到这个答案。您错误地引用了网格的内部存储。您还可以使用dataset.previousdataset.next 将记录指针定位在绑定网格中,并简单地使用dataset.fieldbyname(AidFieldName).AsInteger 检索键值。

    get-cell-value-by-column-name

    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;
    

    【讨论】:

      【解决方案2】:

      使用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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        相关资源
        最近更新 更多