cxGrid에 표시 할 MySQL 쿼리의 결과를 얻으려면 어떻게해야합니까?
Delphi 5를 사용하고 있으며 cxGrid에 MySQL 쿼리 결과를 표시하고 싶습니다. cxGrid, cxGridLevel 및 cxGridDBTableView가 양식에 추가 될 때 기본적으로 설정되는 방식을 설정했습니다. cxGridDBTableView에 대한 DataController.DataSource는 DSNewKits라는 TDataSource이며 DataSet은 NewKitsQry라는 tMySQLQuery로 설정됩니다.
데이터를 표시 할 때가되면 DSNewKits의 Enabled 속성을 false로 설정하고 NewKitsQry의 Close 메서드를 실행 한 다음 DSNewKits의 Enabled 속성을 true로 설정하고 NewKitsQry의 SQL.Text 속성을 설정하고 Open 메서드 NewKitsQry를 실행합니다. . 그런 다음 쿼리의 결과 수를 표시하는 메시지 대화 상자가 있고 408이 있으므로 쿼리가 제대로 작동하고 있음을 알 수 있습니다. 그리드는 사이에 줄이있는 행과 열을 표시하고 "표시 할 데이터 없음"메시지는 없지만 모든 셀이 비어 있습니다.
이 단계를 다른 순서로 수행하고 일부를 주석 처리하는 등의 작업을 시도했지만 데이터가 표시되지 않습니다. 나는 간단하거나 명백한 것을 놓치고 있다고 확신하지만 온라인에서 예제를 찾을 수 없습니다. 도움을 주셔서 감사합니다!
(코드를 포함하도록 편집 됨) 다음은 내 코드입니다.
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
cxGridLevel, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
cxClasses, cxControls, cxGridCustomView, cxGrid, ExtCtrls, Db,
mySQLDbTables, ovcbase, ovcfiler, ovcstore,
gECCConst,
StdCtrls;
type
Tf_cw_cxgrid_db = class(TForm)
WebCatDB: TmySQLDatabase;
NewKitsQry: TmySQLQuery;
DSNewKits: TDataSource;
Panel1: TPanel;
cxNewKitsGrid: TcxGrid;
cxNewKitsGridDBTableView1: TcxGridDBTableView;
cxNewKitsGridDBTableView1CompanyID: TcxGridDBColumn;
cxNewKitsGridDBTableView1RegionID: TcxGridDBColumn;
cxNewKitsGridDBTableView1BranchID: TcxGridDBColumn;
cxNewKitsGridDBTableView1CustID: TcxGridDBColumn;
cxNewKitsGridDBTableView1Username: TcxGridDBColumn;
cxNewKitsGridDBTableView1KitID: TcxGridDBColumn;
cxNewKitsGridDBTableView1KitComment: TcxGridDBColumn;
cxNewKitsGridDBTableView1KitEffDate: TcxGridDBColumn;
cxNewKitsGridDBTableView1KitExpDate: TcxGridDBColumn;
cxNewKitsGridDBTableView1KitNote: TcxGridDBColumn;
cxNewKitsGridDBTableView1KitType: TcxGridDBColumn;
cxNewKitsGridDBTableView1KitFlags: TcxGridDBColumn;
cxNewKitsGridDBTableView1KitTab: TcxGridDBColumn;
cxNewKitsGridDBTableView1KitAddDate: TcxGridDBColumn;
cxNewKitsGridDBTableView1KitEditedDate: TcxGridDBColumn;
cxNewKitsGridDBTableView1Line: TcxGridDBColumn;
cxNewKitsGridDBTableView1ProductID: TcxGridDBColumn;
cxNewKitsGridDBTableView1MfgProdID: TcxGridDBColumn;
cxNewKitsGridDBTableView1PartNum: TcxGridDBColumn;
cxNewKitsGridDBTableView1ProductDesc: TcxGridDBColumn;
cxNewKitsGridDBTableView1Qty: TcxGridDBColumn;
cxNewKitsGridDBTableView1RefQty: TcxGridDBColumn;
cxNewKitsGridDBTableView1UnitPrice: TcxGridDBColumn;
cxNewKitsGridDBTableView1UnitPriceType: TcxGridDBColumn;
cxNewKitsGridDBTableView1UofM: TcxGridDBColumn;
cxNewKitsGridDBTableView1PSUofM: TcxGridDBColumn;
cxNewKitsGridDBTableView1UNSPSC: TcxGridDBColumn;
cxNewKitsGridDBTableView1ItemNote: TcxGridDBColumn;
cxNewKitsGridDBTableView1ItemGroupID: TcxGridDBColumn;
cxNewKitsGridDBTableView1ItemDrpDnHdr: TcxGridDBColumn;
cxNewKitsGridDBTableView1ItemSection: TcxGridDBColumn;
cxNewKitsGridDBTableView1ItemFlags: TcxGridDBColumn;
cxNewKitsGridDBTableView1ItemAddDate: TcxGridDBColumn;
cxNewKitsGridDBTableView1ItemEditedDate: TcxGridDBColumn;
cxNewKitsGrid1Level1: TcxGridLevel;
RegistryStore: TOvcRegistryStore;
userqry: TmySQLQuery;
Button1: TButton;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
f_cw_cxgrid_db: Tf_cw_cxgrid_db;
implementation
{$R *.DFM}
procedure Tf_cw_cxgrid_db.FormShow(Sender: TObject);
var
Server : String;
User : String;
Passwd : String;
DBName : String;
Button : Integer;
WCPath : String;
begin
RegistryStore.Open;
Server := RegistryStore.ReadString( 'SBAdmin', 'Host', '127.0.0.1');
User := RegistryStore.ReadString( 'SBAdmin', 'User', '');
Passwd := RegistryStore.ReadString( 'SBAdmin', 'Password', '');
DBName := RegistryStore.ReadString( 'SBAdmin', 'Database', WebCatDefUserDBName ); { caw 7-24-20 }
RegistryStore.Close;
WebCatDB.Host := Server;
WebCatDB.UserName := User;
WebCatDB.UserPassword := Passwd;
WebCatDB.DatabaseName := 'WEBCAT_' + DBName;
end;
procedure Tf_cw_cxgrid_db.Button1Click(Sender: TObject);
begin
DSNewKits.Enabled := False;
NewKitsQry.Close;
try
DSNewKits.Enabled := True;
NewKitsQry.SQL.Text := 'SELECT KitHdrs.CompanyID, KitHdrs.RegionID, KitHdrs.BranchID, KitHdrs.CustID, ' +
'KitHdrs.Username, KitHdrs.KitID, KitHdrs.KitComment, KitHdrs.KitEffDate, ' +
'KitHdrs.KitExpDate, KitHdrs.KitNote, KitHdrs.KitType, KitHdrs.KitFlags, KitHdrs.KitTab, ' +
'KitHdrs.KitAddDate, KitHdrs.KitEditedDate, KitLines.Line, KitLines.ProductID, ' +
'KitLines.MfgProdID, KitLines.PartNum, KitLines.ProductDesc, KitLines.Qty, ' +
'KitLines.RefQty, KitLines.UnitPrice, KitLines.UnitPriceType, KitLines.UofM, ' +
'KitLines.PSUofM, KitLines.UNSPSC, KitLines.ItemNote, KitLines.ItemGroupID, ' +
'KitLines.ItemDrpDnHdr, KitLines.ItemSection, KitLines.ItemFlags, ' +
'KitLines.ItemAddDate, KitLines.ItemEditedDate ' +
'FROM KitHdrs JOIN KitLines ON KitHdrs.KitSeq = KitLines.KitSeq;';
NewKitsQry.Open;
cxNewKitsGridDBTableView1.DataController.CreateAllItems;
MessageDlg( 'There are ' + IntToStr( NewKitsQry.RecordCount ) + ' records.', mtInformation, [mbOK], 0 );
except
MessageDlg( 'There was an error displaying the kit databases.', mtError, [mbOK], 0 );
end;
end;
end.
답변
cxGrid는 훌륭한 구성 요소이지만 깊이 중첩 된 속성이 너무 많기 때문에 cxGrid를 처음부터 설정하는 것이 매우 어려울 수 있습니다.
아래 예제를 작성하여 코드에서 cxGrid를 완전히 만들고 설정하는 방법을 보여 주어 수행해야하는 최소값을 쉽게 확인할 수 있습니다. 코드에 채워진 TClientDataSet을 사용하여 그리드의 데이터를 제공하므로 예제가 완전히 독립적입니다. 기존 MySql 데이터 세트에 적용하는 것은 간단합니다.
type
TForm1 = class(TForm)
CDS1: TClientDataSet;
DS1: TDataSource;
DBNavigator1: TDBNavigator;
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
protected
public
cxGrid : TcxGrid;
cxLevel : TcxGridLevel;
cxView : TcxGridDBTableView;
end;
[...]
// This is a utility function to create TFields in code
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
// All the code to set up the cxGrid is in this event handler
// First, create the Fields of the ClientDataSet
Field := CreateField(TIntegerField, Self, CDS1, 'ID', 'CDS1ID', 0, fkData);
Field := CreateField(TIntegerField, Self, CDS1, 'Qty', 'CDS1Qty', 0, fkData);
Field := CreateField(TCurrencyField, Self, CDS1, 'UnitPrice', 'CDS1UnitPrice', 0, fkData);
CDS1.CreateDataSet;
CDS1.IndexFieldNames := 'ID';
// Next, populate the CDS with a few records
CDS1.InsertRecord([1, 1, 1]);
CDS1.InsertRecord([2, 2, 5]);
CDS1.InsertRecord([3, 3, 6]);
CDS1.First;
DS1.DataSet := CDS1;
// Now, create a cxGrid to display the CDS data
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';
cxView.DataController.KeyFieldNames := 'ID';
cxLevel.GridView := cxView;
cxView.DataController.DataSource := DS1;
cxView.DataController.CreateAllItems;
end;