0

cxGrid で奇妙な問題が発生しました。クエリを実行してすべてのレコードを取得すると、レコードがグリッドに表示されます。その単純なクエリ:

'select * from mytable order by name asc'

ただし、グリッドの最初のレコードを選択しようとすると、グリッドはグリッドの中央にあるランダムなレコードにジャンプします。グリッドの最初のレコードから 1 つのグリッドにジャンプするまでスクロールできません。ただし、その記録を超えて、通常どおり上下にスクロールできます。真ん中から上にスクロールすることも、そこにあるレコードを選択することもできません。グリッドが真ん中のレコードで止まっているようです。

DataController を次のように変更すると

GridMode = True

その後、問題なくスクロールできますが、グリッドの機能が失われます。グリッドを通常のグリッドに置き換えるとスクロールが機能するため、データセットの問題ではありません。

だから、これは何らかのバグなのか、それともグリッドの設定が誤ってオン/オフされているのか疑問に思っています。

ps。FindPanel が表示されます。

4

2 に答える 2

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
于 2015-07-19T07:35:15.977 に答える
0

これを機能させる唯一の方法は、クエリを実行する前に同期モードを無効にすることです。

cxGrid2DBTableView1.DataController.DataModeController.SyncMode := False;

もう一度有効にすることを忘れないでください。

最適な解決策ではありませんが、誰かがより良い解決策を知っていれば、私は大いに感謝しています。

于 2015-07-18T06:12:18.210 に答える