cxGrid :使用箭头键代替 "go to next cell on enter" 使用 "enter"

cxGrid : instead of "go to next cell on enter" using "enter" do that with the arrow keys

有什么方法可以实现 cxGrid 的功能 "go to next cell on enter" 但使用键盘上的箭头键而不是按 "enter" ???

现在我可以使用箭头键导航,但我移动到的单元格未被选中(蓝色)。如果我编辑列中的一个单元格并移动到它下面的单元格(使用箭头键),网格会跳转到网格中的其他随机记录,这很烦人。

这是设置问题还是您必须编写此功能?

编辑: 这是我用来收集数据的简单临时 table。它没有索引字段或 autoinc 字段:

procedure TForm3.cxButton1Click(Sender: TObject);
begin
DataModule2.ACRQuery2.Close;
DataModule2.ACRQuery2.SQL.Clear;
DataModule2.ACRQuery2.SQL.Text :='insert into TEMP select company_id,member_id,surname,name from MEMBERS where company_id =:a1';
DataModule2.ACRQuery2.Params.ParamByName('a1').Value :=cxLookupComboBox2.Text;
DataModule2.ACRQuery2.ExecSQL;

DataModule2.ACRQuery3.Close;
DataModule2.ACRQuery3.SQL.Clear;
DataModule2.ACRQuery3.SQL.Text :='update temp set month=:a1,year=:a2';
DataModule2.ACRQuery3.Params.ParamByName('a1').Value :=cxComboBox2.Text;
DataModule2.ACRQuery3.Params.ParamByName('a2').Value :=cxTextEdit2.Text;
DataModule2.ACRQuery3.ExecSQL;

DataModule2.TEMP.Refresh;
end;

数据加载但是当我编辑第一条记录并使用向下箭头移动时,光标跳到网格的末尾。

使用箭头键功能导航 normally.I 可以毫无问题地向下滚动列并编辑我暂停的任何记录。但是一旦我编辑它并移动到下一条记录,光标就会跳到其他地方。似乎同步不起作用。我真的不知道。我不会以任何方式排序。

温度table:

Is it a question of settings or must you program this functionality ?

是的,这是一个设置问题,不需要任何代码。但是,您的项目显然存在问题,我认为您需要先解决这个问题。

当您说 "the grid jumps to some other random record in the grid,which is annoying." 时,听起来好像您从错误的地方开始尝试获得您想要的导航行为,因为这样的跳跃肯定不应该发生。而且它不在我的任何 cxGrid 项目中。

无论如何,我发现对象检查器中的 cxGridDBTableView 的表示有时很难 "see the wood for the trees"。然后我要做的是使用一个完全在代码中创建网格的项目 - 见下文。

下面的代码是完全独立的,不需要任何事件处理程序、持久 TFields 等。如果您尝试一下,您应该会发现默认情况下,在创建时,网格 确实 支持使用光标键上下和左右单元格导航。唯一的例外是,在编辑当前单元格内容时,左右键对单元格导航不起作用。但是,如果您取消注释该行

  cxView.DataController.Options := cxView.DataController.Options + [dcoImmediatePost];

然后,在单元格中编辑时按 Enter 会立即将编辑发送回数据集,并且网格 允许您导航出单元格使用向左或向右箭头键。我敢肯定,通过在代码中处理键处理,有更奇特的方法可以实现这种效果,但至少 dcoImmediatePost 方法具有不需要代码的优点。

当应用程序启动时,您应该会看到顶行 "highlighted"(默认为蓝色),但它的 LH 单元格除外,该单元格处于焦点状态。

希望此示例将帮助您确定项目中 "jumping" 的原因,并且还可以帮助您在光标键导航方面完善您想要获得的内容的描述。

代码

procedure TForm1.CreateGrid;
begin
  cxGrid := TcxGrid.Create(Self);
  cxGrid.Parent := Self;
  cxGrid.Width := 400;

  cxLevel := cxGrid.Levels.Add;
  cxLevel.Name := 'Firstlevel';

  cxView := cxGrid.CreateView(TcxGridDBTableView) as TcxGridDBTableView;
  cxView.Name := 'ATableView';
  //  Uncomment the following line to make the grid respond to the `Enter` key by posting any pending change to the data row
  //    cxView.DataController.Options := cxView.DataController.Options + [dcoImmediatePost];

  cxView.DataController.KeyFieldNames := 'ID';

  cxLevel.GridView := cxView;

  cxView.DataController.DataSource := DS1;

  cxView.DataController.CreateAllItems;

end;

function CreateField(AFieldClass : TFieldClass; AOwner : TComponent; ADataSet : TDataSet;
AFieldName, AName : String; ASize : Integer; AFieldKind : TFieldKind) : TField;
begin
  Result := AFieldClass.Create(AOwner);
  Result.FieldKind := AFieldKind;
  Result.FieldName := AFieldName;
  Result.Name := AName;
  Result.Size := ASize;
  Result.DataSet := ADataSet;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
  Field : TField;
begin

  Field := CreateField(TAutoIncField, Self, CDS1, 'ID', 'CDS1ID', 0, fkData);
  Field := CreateField(TBooleanField, Self, CDS1, 'Marked', 'CDS1Marked', 0, fkData);
  Field := CreateField(TStringField, Self, CDS1, 'Name', 'CDS1Namefield', 20, fkData);
  Field := CreateField(TStringField, Self, CDS1, 'Value', 'CDS1Valuefield', 20, fkData);

  CDS1.CreateDataSet;

  CDS1.IndexFieldNames := 'ID';

  for i := 1 to 5 do begin
    CDS1.Insert;
    CDS1.FieldByName('Marked').AsBoolean := Odd(i);
    CDs1.FieldByName('Name').AsString := 'Name' + IntToStr(i);
    CDs1.FieldByName('Value').AsString := 'Value  ' + IntToStr(i);
    CDS1.Post;
  end;

  CDS1.First;

  CreateGrid;

  ActiveControl := cxGrid;

end;

经过无数次实验,我想我发现了问题:似乎要使用此功能,数据控制器必须设置为 "Grid mode"。