循环遍历cxgrid上的记录并更新字段/列

时间:2015-06-08 14:51:09

标签: delphi devexpress tcxgrid

我有一个cxGrid,我在其中应用过滤器来选择某些记录。完成后,我希望能够更新网格中的字段/列,以标记将用于下一个操作的每个记录。 我无法弄明白

在描述我的问题时,也许我还不够具体。 我有cxGrid我已应用​​过滤器选择一些记录。 然后我需要做的是单击一个列标题,然后为这些记录设置一个名为fldselected的字段设置为True。

2 个答案:

答案 0 :(得分:1)

查看Dev Express的文章https://www.devexpress.com/Support/Center/Question/Details/A1095。不要让这篇文章11岁的事实愚弄你。同样的技术仍然适用。您可以在代码中或在网格编辑器中设置它。

  1. 在网格编辑器中创建列。
  2. 将DataBinding.ValueType列设置为布尔值(如果您想要复选框表示的话)
  3. 设置数据控制器的KeyFieldNames属性。很重要!我花了几个小时用一个不起作用的未绑定列抓住我的头只发现KeyFieldNames没有设置。
  4. 使用DataController记录或值数组,可以在下一个操作中引用未绑定列,具体取决于您设置的方式。因为它是未绑定的,所以你不能通过底层的DataSet引用它。

答案 1 :(得分:1)

你所更新的q要求的是直截了当的,和往常一样,有Devex的东西,它是 所有人都在OLH,只要你能找到进入它的方式。

查找当前与过滤器匹配的行的方法是使用

cxGrid1DBTableView1.DataController.FilteredRecordIndex[]

属性。然后,您可以在数据集中找到该记录,以使用

以某种方式处理它
cxGrid1DBTableView1.DataController.LocateByKey().

更新:此答案的原始版本假设数据集具有整数ID字段。 由于OP已经说他使用了GUID,我已经相应地更新了它。

假设TClientDataSet CDS1有字段Guid:TGuidField,Name:TStringfield,size 32 和选中:TBooleanField并连接到 启用了过滤的cxxTableView,即TcxGrid。

  • 确保将cxGrid1DBTableView1.DataController.KeyFieldNames设置为' Guid'。

  • 将常规TDBGrid添加到表单并将其指向与TcxGrid相同的数据源。关键点 这样可以很容易地验证代码是否按要求运行。

  • 将以下代码添加到设备中,并指向cxDBTableView1的OnColumnHeaderClick at 处理程序cxGrid1DBTableView1ColumnHeaderClick,以及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;