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