【问题标题】:cxGrid prevent grouped deletecxGrid 防止分组删除
【发布时间】:2014-05-29 14:38:20
【问题描述】:

在我的 cxGrid 中,我有按日期分组的记录。但是,当用户选择分组日期并点击删除时,在该日期下提交的所有记录都会被删除。有没有办法防止这种情况?我希望单独删除记录。

编辑:我忘了提:我正在使用网格的 GroupByBox 函数进行分组。

【问题讨论】:

  • 你的代码在哪里?你是在绑定还是非绑定模式下使用网格?
  • 绑定模式当然...
  • 如果用户选择组并按下Del,实际上意味着他正在尝试删除组(所有项目)。无论如何,如果您对默认行为不满意,您可以禁用网格的删除命令(请参阅视图的 .OptionData)并根据需要实现它 - 例如将操作分配给某些工具栏项并删除您想要的内容。
  • 所以这意味着我实际上无法阻止组删除?有什么方法可以检测到删除组选择以便警告用户?

标签: delphi devexpress delphi-xe4 tcxgrid


【解决方案1】:

您可以在删除操作之前检查gridView.Controller.FocusedRow.IsData 属性。示例如下:

  1. 通过设置gridView.OptionsData.Deleting = False;禁用“自动删除”功能
  2. 在gridView的事件OnKeyUp中添加代码:

    procedure TmyForm.gridViewKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      if (Key = VK_DELETE) and (gridView.Controller.FocusedRow <> nil) then
      begin
        if gridView.Controller.FocusedRow.IsData then
        begin
          gridView.DataController.DeleteFocused;
        end
        else
        begin
          ShowMessage('You can''t delete group records.');
        end;
      end;
    end;
    

如果您使用默认数据集操作或cxDBNavigator,请尝试以下操作:

  1. 通过设置gridView.OptionsData.DeleteConfirmation = False;禁用“确认删除”功能
  2. 在数据集事件BeforeDelete中添加“中止”代码:

    procedure TmyForm.DataSetBeforeDelete(DataSet: TDataSet);
    begin
      if (gridView.Controller.FocusedRow <> nil)
        and not gridView.Controller.FocusedRow.IsData then
      begin
        ShowMessage('You can''t delete group records.');
        Abort;
      end;
    end;
    
  3. 将“中止”代码添加到代码导航器事件OnButtonClick(如果您不想显示删除确认):

    procedure TmyForm.DBNavigatorButtonsButtonClick(Sender: TObject; AButtonIndex: Integer; var ADone: Boolean);
    begin
      if (AButtonIndex = NBDI_DELETE)
        and (gridView.Controller.FocusedRow <> nil)
        and not gridView.Controller.FocusedRow.IsData then
      begin
        ShowMessage('You can''t delete group records.');
        Abort;
      end;
    end;
    

【讨论】:

  • 这很好,但我需要保留删除网格中记录的选项。
  • 问题在于我正在使用网格的内置导航器。如果我阻止删除,那么用户必须使用键盘删除记录,因为删除字形显示为灰色。
  • 我添加了数据集和日期导航器代码的提示。阅读答案的第二部分。
  • [dcc32 Error] DataModule.pas(179): E2029 ')' 预期但发现标识符'Controller' ----[dcc32 Error] DataModule.pas(179): E2003 Undeclared identifier: ' cxGrid1DBTableView1'---这是使用你的第二个建议...
  • 您必须在 DataModule.pas 中添加带有表单单位(必须包含网格)的 uses 子句,例如:“uses unit1”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 2012-08-13
  • 2013-06-05
  • 2010-09-19
相关资源
最近更新 更多