1

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

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

4

2 回答 2

2

您更新的 q 所要求的内容很简单,并且与 Devex 的东西一样,只要您能找到进入它的方式,它就在 OLH 中。

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

cxGrid1DBTableView1.DataController.FilteredRecordIndex[]

财产。然后,您可以在数据集中找到该记录,以使用某种方式对其进行处理

cxGrid1DBTableView1.DataController.LocateByKey().

更新:这个答案的原始版本假设数据集有一个整数 ID 字段。正如 OP 所说,他改用 GUID,我已经相应地更新了它。

假设 TClientDataSet CDS1 具有字段 Guid:TGuidField、Name:TStringfield、大小 32 和 Selected:TBoleanField,并连接到 TcxGrid 的启用过滤的 cxDBTableView。

  • 确保 cxGrid1DBTableView1.DataController.KeyFieldNames 设置为“Guid”。

  • 将常规 TDBGrid 添加到表单并将其指向与 TcxGrid 相同的数据源。这样做的目的是使验证代码是否按要求工作变得容易。

  • 将下面的代码添加到单元中,并将cxDBTableView1的OnColumnHeaderClick指向处理程序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;
于 2015-06-11T12:39:13.533 回答
1

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

  1. 在网格编辑器中创建列。
  2. 将列 DataBinding.ValueType 设置为 Boolean(如果这是您希望复选框表示的内容)
  3. 设置数据控制器的 KeyFieldNames 属性。很重要!我花了几个小时用一个不起作用的未绑定列挠头,却发现没有设置 KeyFieldNames。

在您的下一个操作中,可以使用 DataController Records 或 Values 数组引用未绑定的列,具体取决于您的设置方式。因为它是未绑定的,所以您无法通过底层 DataSet 引用它。

于 2015-06-08T17:52:25.637 回答