cxGrid不会向上滚动

时间:2015-07-18 05:35:37

标签: delphi devexpress tcxgrid

我遇到了cxGrid的一个奇怪问题。 执行查询以获取所有记录后,记录显示在网格中。 这是一个简单的查询:

  

'按名称asc'

从mytable订单中选择*

但是,如果我尝试选择网格中的第一条记录,网格将跳转到网格中间的某个随机记录。我无法从网格中的第一条记录滚动到一个网格跳转到。但是,除了那个记录,我可以正常上下滚动。我不能从中间向上滚动,也不能在那里选择任何记录。看来我的网格卡在中间记录上。

如果我将DataController更改为

  

GridMode = True

然后我可以滚动没有问题,但我失去了网格的功能。 这不是数据集问题,因为当我用普通网格替换网格时,滚动功能正常。

所以我想知道这是否是某种错误,或者是网格中的设置是偶然打开/关闭的。

PS。 FindPanel可见。

2 个答案:

答案 0 :(得分:1)

如果有帮助,下面是极简主义cxGrid项目的代码和DFM 对我来说很好,并没有显示你描述的行为。如果适用 你也可以帮助你找出你项目的不同之处 导致你的问题。

代码:

type
  TForm1 = class(TForm)
    CDS1: TClientDataSet;
    DataSource1: TDataSource;
    cxGrid1DBTableView1: TcxGridDBTableView;
    cxGrid1Level1: TcxGridLevel;
    cxGrid1: TcxGrid;
    CDS1ID: TIntegerField;
    CDS1Name: TStringField;
    cxGrid1DBTableView1ID: TcxGridDBColumn;
    cxGrid1DBTableView1Name: TcxGridDBColumn;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  protected
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  i,
  j,
  ID : Integer;
  Name : String;
begin
  CDS1.CreateDataSet;
  for i := 1 to 26 do begin
    for j:= 1 to 26 do begin
      ID := i * j;
      Name := Chr(Ord('A') + i - 1) + Chr(Ord('A') + j - 1);
      CDS1.InsertRecord([ID, Name]);
    end;
  end;
  CDS1.First;
  Caption := IntToStr(CDS1.RecordCount);

 cxGrid1DBTableView1.DataController.Filter.BeginUpdate;

 try
   cxGrid1DBTableView1.DataController.Filter.Root.AddItem(cxGrid1DBTableView1Name, foLike, '%A', '%A');
 finally
   cxGrid1DBTableView1.DataController.Filter.EndUpdate;
   cxGrid1DBTableView1.DataController.Filter.Active := true;
  end;
end;

DFM:

object Form1: TForm1
  Left = 259
  Top = 103
  AutoScroll = False
  Caption = 'Form1'
  ClientHeight = 314
  ClientWidth = 444
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  Scaled = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object cxGrid1: TcxGrid
    Left = 0
    Top = 0
    Width = 444
    Height = 314
    Align = alClient
    TabOrder = 0
    object cxGrid1DBTableView1: TcxGridDBTableView
      Navigator.Buttons.CustomButtons = <>
      DataController.DataSource = DataSource1
      DataController.KeyFieldNames = 'ID'
      DataController.Summary.DefaultGroupSummaryItems = <>
      DataController.Summary.FooterSummaryItems = <>
      DataController.Summary.SummaryGroups = <>
      FilterRow.Visible = True
      OptionsView.GroupByBox = False
      object cxGrid1DBTableView1ID: TcxGridDBColumn
        DataBinding.FieldName = 'ID'
      end
      object cxGrid1DBTableView1Name: TcxGridDBColumn
        DataBinding.FieldName = 'Name'
      end
    end
    object cxGrid1Level1: TcxGridLevel
      GridView = cxGrid1DBTableView1
    end
  end
  object CDS1: TClientDataSet
    Aggregates = <>
    IndexFieldNames = 'Name'
    Params = <>
    Left = 16
    Top = 24
    object CDS1ID: TIntegerField
      FieldName = 'ID'
    end
    object CDS1Name: TStringField
      FieldName = 'Name'
      Size = 40
    end
  end
  object DataSource1: TDataSource
    DataSet = CDS1
    Left = 56
    Top = 24
  end
end

答案 1 :(得分:0)

我能做到这一点的唯一方法是在执行查询之前禁用同步模式:

  

cxGrid2DBTableView1.DataController.DataModeController.SyncMode:=   假;

只需要记住再次启用它。

不是最佳解决方案,但如果有人知道更好的解决方案,我会非常感激。