2

我有一个 DevExpress 网格,我想在其中添加一个未绑定的复选框,以便能够选择一些项目。做出选择后,我按下一个按钮,我必须循环网格以获取所有选定的项目。它必须是一个复选框。我尝试过使用多选网格,但用户无法使用它。

我已经尝试了在支持站点上找到的所有样本,但没有运气。

  • 我需要不受约束的方法,因为它是一个多用户设置,并且用户一直在为彼此选择和取消选择。

我的问题:有没有人有一个工作样本来说明如何做到这一点?

4

1 回答 1

1

我已经这样做了,它(是!)非常丑陋!创建带有绑定列的网格视图,并添加一个字段类型为布尔值的未绑定复选框列。

基本上我处理网格视图的 OnCellClick 。我检查单击的项目是否是复选框列 - 通过在视图中查找具有复选框类型的第一个未绑定列。然后我切换它的状态。

我已将数据集上的 AutoEdit 设置为 true,但将删除/编辑/插入设置为 false,并且 ImmediateEditor 为 false。不完全确定其中哪些是重要的。

我认为最难的事情是试图弄清楚网格和视图级别对象的复杂层次结构,并找出哪些级别包含哪些所需的位。我敢肯定有更好的方法可以做到,但我们现在所拥有的方法是有效的,我不会再碰它了!

这是从我的代码中提取的,但稍作修改并没有按原样进行测试 - 它还需要更多的错误检查:

procedure TMyForm.ViewCellClick(Sender: TcxCustomGridTableView;
  ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
  AShift: TShiftState; var AHandled: Boolean);
var
  col: TcxGridColumn;
begin
  // Manually handle the clicking of the checkbox cell - otherwise it seems
  // virtually impossible to get the checked count correct.
  col := GetViewCheckColumn(Sender);
  if (Sender.Controller.FocusedItem = col) then
  begin
    ToggleRowSelection(TcxCustomGridTableView(TcxGridSite(Sender).GridView), col);
  end;
end;

procedure TMyForm.ToggleRowSelection(AView: TcxCustomGridTableView; ACol: TcxGridColumn);
var
  rec: TcxCustomGridRecord;
begin
  rec := AView.Controller.FocusedRecord;
  if (rec = nil) then exit;

  if (rec.Values[ACol.Index] = TcxCheckBoxProperties(ACol.Properties).ValueChecked) then
  begin
    rec.Values[ACol.Index] := TcxCheckBoxProperties(ACol.Properties).ValueUnchecked;
  end
  else
  begin
    rec.Values[ACol.Index] := TcxCheckBoxProperties(ACol.Properties).ValueChecked;
  end;
end;


function TMyForm.GetViewCheckColumn(AView: TcxCustomGridView): TcxGridColumn;
var
  index: integer;
  vw: TcxCustomGridTableView;
  item: TcxCustomGridTableItem;
begin
  // We're looking for an unbound check box column - we'll return the first
  // one found.

  Assert(AView <> nil);
  result := nil;
  if (AView is TcxCustomGridTableView) then
  begin
    vw := TcxCustomGridTableView(AView);
    for index := 0 to vw.ItemCount - 1 do
    begin
      item := vw.Items[index];
      if (item.Properties is TcxCustomCheckBoxProperties) then
      begin
        if (item is TcxGridDBColumn) then
        begin
          if (TcxGridDBColumn(item).DataBinding.FieldName = '') then
          begin
            result := TcxGridColumn(item);
            break;
          end;
        end;
      end;
    end;
  end;
end;

然后我通过检查网格的 OnKeyUp 中的空格键并调用 ToggleRowSelection 来扩展它,并且对于双击一行也类似。

遍历行时,您可以测试是否使用以下内容检查了行:

function TMyForm.GetViewIsRowChecked(AView: TcxCustomGridView; ARecord: TcxCustomGridRecord): boolean;
var
  col: TcxGridColumn;
begin
  result := False;
  col := GetViewCheckColumn(AView);
  if ((col <> nil) and (ARecord <> nil)) then
  begin
    result := (ARecord.Values[col.Index] = TcxCheckBoxProperties(col.Properties).ValueChecked);
  end;
end;

我想就是这样。我已经从我们已经建立了一段时间的大型网格/视图辅助单元中挖出了它。哦,它目前正在使用带有 DXVCL v2011 vol 1.10 的 Delphi 2010。

希望能帮助到你。

于 2013-01-18T11:10:47.843 回答