cxGrid 6 FocusedRecordChanged想要知道FocusedItemChanged

时间:2010-11-03 10:19:40

标签: delphi devexpress vcl

我将GotToNextCellOnEnter和FocuscellOnCycle属性设置为true。当我在最后一个单元格上按Enter时,FocusedRecordChanged事件将触发,然后触发FocusedItemChanged事件。有没有办法检测FocusedItemChanged事件是由于FocusRecordChanged事件中的火灾引起的。我试图使用这些事件阻止用户专注于特定的细胞。如果FocusedItemChanged事件将在它之后触发,我想忽略FocusedRecordChanged事件。理想情况下我想要的是一个FocusedCellChanged事件,但没有其中一个。

由于

2 个答案:

答案 0 :(得分:1)

正如ExpressQuantumGrid Suite 6的帮助中所述,OnFocusedRecordChanged

  

将焦点移动到其他记录后发生。

和OnFocusedItemChanged

  

将焦点更改为其他View项时发生。

其中 Item 是一列。

这意味着(使用当前配置,即GoToNextCellOnEnter和FocusCellOnCycle设置为true)每次离开按Enter键记录的最后一列时,两个事件始终 fire,因为你要移动到下一条记录的第一项。

编辑:在使用向下键离开的情况下,OnFocusedItem不会触发是绝对正常的,因为它只会在您更改列时才会触发。您可以尝试捕获用于离开单元格的密钥。我的猜测是OnKeyDown事件发生在这两个事件中的任何一个之前。

如果我理解您的需求,您需要在事件处理程序中区别对待最后一列。

希望有所帮助,

祝你好运

答案 1 :(得分:1)

我建议你禁用这两个选项并自己实现这个逻辑。这是默认实现,您只需更改它以符合您的自定义逻辑:

procedure TForm1.cxGrid1DBTableView1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  ASite: TcxGridSite;
begin
  if Key = VK_RETURN then
  begin
    ASite := TcxGridSite(Sender);
    FocusNextCell(TcxGridTableView(ASite.GridView));
    Key := 0;
  end;
end;

procedure TForm1.cxGrid1DBTableView1EditKeyDown(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem;
  AEdit: TcxCustomEdit; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_RETURN then
  begin
    FocusNextCell(TcxGridTableView(Sender));
    Key := 0;
  end;
end;

procedure TForm1.FocusNextCell(AView: TcxGridTableView);
var
  AColumn: TcxGridColumn;
begin
  AColumn := AView.Controller.FocusedColumn;
  if AView.Controller.FocusedRow.IsData then
  begin
    if AColumn.VisibleIndex < AView.VisibleColumnCount - 1 then
      AView.VisibleColumns[AColumn.VisibleIndex + 1].Focused := True
    else
      if AView.Controller.FocusNextRecord(AView.Controller.FocusedRecordIndex, True, True, False, False) and AView.Controller.FocusedRecord.HasCells then
        AView.VisibleColumns[0].Focused := True;
  end
  else
    if AView.Controller.FocusNextRecord(AView.Controller.FocusedRecordIndex, True, True, False, False) and AView.Controller.FocusedRecord.HasCells then
      AView.VisibleColumns[0].Focused := True;
  AView.Controller.EditingController.ShowEdit();
end;