我遇到了cxGrid的一个奇怪问题。 执行查询以获取所有记录后,记录显示在网格中。 这是一个简单的查询:
'按名称asc'
从mytable订单中选择*
但是,如果我尝试选择网格中的第一条记录,网格将跳转到网格中间的某个随机记录。我无法从网格中的第一条记录滚动到一个网格跳转到。但是,除了那个记录,我可以正常上下滚动。我不能从中间向上滚动,也不能在那里选择任何记录。看来我的网格卡在中间记录上。
如果我将DataController更改为
GridMode = True
然后我可以滚动没有问题,但我失去了网格的功能。 这不是数据集问题,因为当我用普通网格替换网格时,滚动功能正常。
所以我想知道这是否是某种错误,或者是网格中的设置是偶然打开/关闭的。
PS。 FindPanel可见。
答案 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:= 假;
只需要记住再次启用它。
不是最佳解决方案,但如果有人知道更好的解决方案,我会非常感激。