cxGrid:而不是"进入下一个单元格"使用"输入"使用箭头键

时间:2016-06-11 00:20:12

标签: delphi devexpress tcxgrid

有没有办法可以实现cxGrid的功能"进入下一个单元格"但是使用键盘上的箭头键而不是按下"输入" ???

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

是设置问题还是您必须对此功能进行编程?

编辑: 这是一个用于收集数据的简单临时表。它没有索引字段或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;

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

enter image description here

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

临时表: enter image description here

2 个答案:

答案 0 :(得分:2)

  

是设置问题还是您必须对此功能进行编程?

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

当你说'#34;网格跳转到网格中的其他随机记录时,这很烦人。",听起来好像你是从错误的地方开始试图获得导航行为你想要因为那样的跳跃肯定不会发生。它在我的任何cxGrid项目中都没有。

无论如何,我发现在Object Inspector中表示cxGridDBTableView有时会让人很难看到木头的树木"。我所做的就是使用一个完全用代码创建网格的项目 - 见下文。

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

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

然后,在单元格中编辑时按Enter会立即将编辑发布回数据集,而网格允许您使用左侧或右箭头键。我确信通过在代码中处理密钥处理有更好的方法来实现这种效果,但至少dcoImmediatePost方法的优点是不需要代码。

当应用程序启动时,您应该会看到顶行"突出显示" (默认为蓝色),但其聚焦的LH细胞除外。

希望这个例子可以帮助你找出"跳跃的原因。在您的项目中,也可以帮助您根据光标键导航细化您想要获得的描述。

代码

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;

答案 1 :(得分:0)

经过无数次实验,我认为我已经找到了问题:似乎要使用此功能,数据控制器必须设置为"网格模式"。