2014-12-10 59 views
0

어떻게 cxgrids 레코드를 반복합니까? 즉, 델파이 프로그램이 위에서/아래로 cxgrid의 각 레코드를 검사/통과하도록합니다.cxgrid에서 레코드를 반복하는 방법 - Delphi xe2

나는 이것이 어쨌든 도움이된다면 데이터베이스 테이블과 이야기하고있는 tadquery로부터 레코드를 표시하는 cxgrid를 가지고있다.

+1

데이터 세트 레코드를 반복합니다 (앞서 언급 한 'TADQuery').완료되면'DisableControls'와'EnableControls'을 잊지 마세요. – TLama

+1

@TLama가 말한 내용. GUI에서 데이터를 표시하는 데 사용되는 컨트롤이 아닌 GUI이면의 데이터 세트 측면에서 이러한 종류의 작업에 대해 생각하는 습관을 갖는 것이 가장 좋습니다. – MartynA

+0

Btw, "각 레코드"라고 말하면 데이터 집합의 모든 레코드를 의미합니까, 아니면 현재 TcxGrid에 표시된 레코드를 의미합니까? 큰 차이 ... – MartynA

답변

2

TcxGrid의 TcxGridDBTableView에서이를 수행하고 아래의 DataSet을 반복하는 샘플 코드. 이 두 샘플은 DataSet의 필터링 여부와 관계없이 작동합니다.

TcxGrid의 샘플에서는 팔레트에서 그리드를 가져 와서 TcxDBTableView를 추가하고, 데이터 세트의 열을 추가 한 다음 Object Inspector에서 모든 그리드 속성을 기본값으로 남겨 둡니다 (KeyFieldNames는 제외). 내 경우 "FilesID"DataSet의 기본 키 설정이 필요한 TableView.

 ID := cxGrid1DBTableView1.DataController.GetRecordId(TopRowIndex + Row); 

의 ID 값은 다음 호출에 의해 사용됩니다 그래서 같은 행에 대해, 당신은 키 값을 얻을 ID를 - 이것은있는 TableView에서 주어진 행에 대한 데이터 세트의 레코드를 식별 할 수 있도록이다 CDS1.Locate()를 사용하여 레코드를 검색하십시오.

TBookmark는 작업 전에 현재 CDS 레코드를 기록한 후 나중에 다시 읽는 데 사용됩니다. DisableControls 및 EnableControls에 대한 호출은 작업이 진행되는 동안 cxGrid (및 CDS에 연결된 다른 DB 인식 컨트롤)가 변경되는 것을 방지하기위한 것입니다.

procedure TForm1.IterateVisibleGridRows; 
var 
    BM : TBookmark; 
    TopRowIndex : Integer; 
    VisibleCount : Integer; 
    Row : Integer; 
    ID : Integer; 
    Controller : TcxGridTableController; 
    ViewInfo : TcxGridTableViewInfo; 
begin 
    BM := CDS1.GetBookmark; 
    try 

    Controller := cxGrid1DBTableView1.Controller; 
    ViewInfo := TcxGridTableViewInfo(Controller.ViewInfo); 

    TopRowIndex := Controller.TopRowIndex; 
    VisibleCount := ViewInfo.RecordsViewInfo.VisibleCount; 

    CDS1.DisableControls; 

    Row := 0; 
    while Row < VisibleCount do begin 
     ID := cxGrid1DBTableView1.DataController.GetRecordId(TopRowIndex + Row); 
     if CDS1.Locate('FilesID', ID, []) then begin 
     // Do what you want here 
     end; 
     Inc(Row); 
    end; 

    finally 
    CDS1.GotoBookmark(BM); 
    CDS1.FreeBookmark(BM); 
    CDS1.EnableControls; 
    end; 
end; 

는, BTW 난 당신이 무엇을 요구이 하지 알지만, 당신은 TcxGrid를 사용하여하지 않고 데이터 집합을 반복 할 경우, 실제로는 훨씬 더 간단 :

procedure IterateDataSetRows(DataSet : TDataSet); 
var 
    BM : TBookmark; 
begin 
    BM := CDS1.GetBookmark; 
    try 
    // delete the following 2 lines and the one in the finally block if you don't want a "Wait" cursor 
    Screen.Cursor := crSqlWait; 
    Screen.ActiveForm.Update; 

    DataSet.DisableControls; 
    DataSet.First; 

    while not DataSet.Eof do begin 
     // Do what you want here 
     DataSet.Next; 
    end; 

    finally 
    DataSet.GotoBookmark(BM); 
    DataSet.FreeBookmark(BM); 
    DataSet.EnableControls; 
    Screen.Cursor := crDefault; 
    end; 
end; 
1

당신은 didn를 '

이 엑사을 :

모든 방법을 heres 모두 수행하는 예입니다 : 그것은 당신의 그리드의 모든 기록하거나 눈에 보이는 것들 어디 t 말 mple은 cxGrid, cxButton 및 cxMemo가있는 양식을 사용합니다. 플러스 dxMemdataset 여기

는 DFM 코드 :

object Form20: TForm20 
    Left = 0 
    Top = 0 
    Caption = 'Form20' 
    ClientHeight = 299 
    ClientWidth = 462 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    OnCreate = FormCreate 
    DesignSize = (
    462 
    299) 
    PixelsPerInch = 96 
    TextHeight = 13 
    object cxGrid1: TcxGrid 
    Left = 0 
    Top = 0 
    Width = 299 
    Height = 299 
    Align = alLeft 
    TabOrder = 0 
    ExplicitHeight = 635 
    object cxGrid1DBTableView1: TcxGridDBTableView 
     Navigator.Buttons.CustomButtons = <> 
     DataController.DataSource = DataSource1 
     DataController.Summary.DefaultGroupSummaryItems = <> 
     DataController.Summary.FooterSummaryItems = <> 
     DataController.Summary.SummaryGroups = <> 
     object cxGrid1DBTableView1RecId: TcxGridDBColumn 
     DataBinding.FieldName = 'RecId' 
     Visible = False 
     end 
     object cxGrid1DBTableView1Field1: TcxGridDBColumn 
     DataBinding.FieldName = 'Field1' 
     end 
     object cxGrid1DBTableView1Field2: TcxGridDBColumn 
     DataBinding.FieldName = 'Field2' 
     end 
    end 
    object cxGrid1Level1: TcxGridLevel 
     GridView = cxGrid1DBTableView1 
    end 
    end 
    object cxButton1: TcxButton 
    Left = 305 
    Top = 8 
    Width = 154 
    Height = 25 
    Caption = 'Do the trick' 
    TabOrder = 1 
    OnClick = cxButton1Click 
    end 
    object cxMemo1: TcxMemo 
    Left = 305 
    Top = 39 
    Anchors = [akLeft, akTop, akRight, akBottom] 
    Lines.Strings = (
     'cxMemo1') 
    TabOrder = 2 
    Height = 260 
    Width = 154 
    end 
    object dxMemData1: TdxMemData 
    Indexes = <> 
    SortOptions = [] 
    Left = 160 
    Top = 144 
    object dxMemData1Field1: TIntegerField 
     FieldName = 'Field1' 
    end 
    object dxMemData1Field2: TIntegerField 
     FieldName = 'Field2' 
    end 
    end 
    object DataSource1: TDataSource 
    DataSet = dxMemData1 
    Left = 168 
    Top = 152 
    end 
end 
첫 번째 양식에서

우선 내가 어떤 임의의 데이터 생성 생성 :

procedure TForm20.FormCreate(Sender: TObject); 
var 
    i: Integer; 
begin 
    randomize; 
    dxMemData1.DisableControls; 
    try 
    dxMemData1.Open; 
    for i := 0 to 999 do 
     dxMemData1.AppendRecord([i, Random(500), Random(500)]); 
    finally 
    dxMemData1.EnableControls; 
    end; 
end; 

내 그리드가 표시됩니다 데이터 세트의 데이터에 바인딩되어 있기 때문에이 화면에. 그런 다음

type 
    TForm20 = class(TForm) 
    dxMemData1: TdxMemData; 
    dxMemData1Field1: TIntegerField; 
    dxMemData1Field2: TIntegerField; 
    cxGrid1DBTableView1: TcxGridDBTableView; 
    cxGrid1Level1: TcxGridLevel; 
    cxGrid1: TcxGrid; 
    DataSource1: TDataSource; 
    cxGrid1DBTableView1RecId: TcxGridDBColumn; 
    cxGrid1DBTableView1Field1: TcxGridDBColumn; 
    cxGrid1DBTableView1Field2: TcxGridDBColumn; 
    cxButton1: TcxButton; 
    cxMemo1: TcxMemo; 
    procedure FormCreate(Sender: TObject); 
    procedure cxButton1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

그냥 버튼을 눌러해야합니다 : 여기

내 양식 정의 당신이 필터링 기록를 볼 그래서이

procedure TForm20.cxButton1Click(Sender: TObject); 
var 
    RecNo, i: Integer; 
    cxCustomGridRecordViewInfo: TcxCustomGridRecordViewInfo; 
    s: string; 
begin 
    s := Format(
    'You have' + sLineBreak + 
    ' %d records in your Dataset' + sLineBreak + 
    ' %d records in your grid' + sLineBreak + 
    ' %d VISIBLE records in your grid' 
    , [ 
    cxGrid1DBTableView1.DataController.RecordCount, 
     cxGrid1DBTableView1.DataController.FilteredRecordCount, 
     cxGrid1DBTableView1.ViewInfo.VisibleRecordCount 
     ] 
    ); 

    MessageDlg(s, mtInformation, [mbOK], 0); 

    cxMemo1.Lines.BeginUpdate; 
    cxMemo1.Lines.Clear; 

    cxMemo1.Lines.Add(' *** Filtered Records ***'); 

    for i := 0 to cxGrid1DBTableView1.DataController.FilteredRecordCount - 1 do 
    begin 
    RecNo := cxGrid1DBTableView1.DataController.FilteredRecordIndex[i]; 
    cxMemo1.Lines.Add(cxGrid1DBTableView1.DataController.Values[RecNo, 1]); 
    end; 

    cxMemo1.Lines.Add(' *** Visible Records ***'); 

    for i := 0 to cxGrid1DBTableView1.ViewInfo.VisibleRecordCount - 1 do 
    begin 
    cxCustomGridRecordViewInfo := cxGrid1DBTableView1.ViewInfo.RecordsViewInfo[i]; 
    cxMemo1.Lines.Add(cxCustomGridRecordViewInfo.GridRecord.Values[1]); 
    end; 

    cxMemo1.Lines.EndUpdate; 
end; 

입니다 당신이 후 그리드에있는 하나 필터가 적용된 후에도 가능합니다. 가시적 인 레코드은 실제로 화면에 보이는 onec입니다.