【问题标题】:Devexpress grid with unbound column具有未绑定列的 Devexpress 网格
【发布时间】:2013-01-01 09:12:29
【问题描述】:

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

我已经尝试了可以​​在支持网站上找到的所有示例,但没有运气。

  • 我需要未绑定的方法,因为它是多用户设置,并且用户一直在相互选择和取消选择。

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

【问题讨论】:

  • 您的问题到底是什么?是如何添加未绑定的列吗?或者如何“循环网格”?还是完全不同的东西?你在这里根本不问任何问题;你刚刚发布了几个声明。另外,你看到DevExpress GridControl Unbound Columns了吗?

标签: delphi gridview devexpress


【解决方案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。

希望对你有帮助。

【讨论】:

  • 我实际上得到了我在丹麦的一位朋友制作的示例应用程序。如果您有兴趣,我可以问他是否可以与您分享。使用起来非常简单快捷。
  • 感谢您的提议。但我希望我们现在可以把那个项目抛在脑后,所以不要麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
相关资源
最近更新 更多