ฉันจะนำผลลัพธ์ของ MySQL Query ไปแสดงใน cxGrid ได้อย่างไร?
ฉันใช้ Delphi 5 และฉันต้องการแสดงผลลัพธ์ของแบบสอบถาม MySQL ใน cxGrid ฉันมี cxGrid, cxGridLevel และ cxGridDBTableView ตั้งค่าวิธีที่เป็นค่าเริ่มต้นเมื่อเพิ่มลงในฟอร์ม DataController.DataSource สำหรับ cxGridDBTableView คือ TDataSource ชื่อ DSNewKits พร้อม DataSet ที่ตั้งค่าเป็น tMySQLQuery ชื่อ NewKitsQry
เมื่อถึงเวลาแสดงข้อมูลฉันตั้งค่าคุณสมบัติ Enabled ของ DSNewKits เป็น false เรียกใช้เมธอดปิดของ NewKitsQry จากนั้นตั้งค่าคุณสมบัติ Enabled ของ DSNewKits เป็น true ตั้งค่าคุณสมบัติ SQL.Text ของ NewKitsQry และรันวิธีการเปิด 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;