这让我疯了...... 我获取我的数据库的名称以填充cxComboBox1:
procedure TForm1.FormShow(Sender: TObject);
var
I: Integer;
DBList: TStringDynArray;
begin
DBList := TDirectory.GetFiles(ExtractFilePath(ParamStr(0)), '*.abs', TSearchOption.soAllDirectories);
for I := 0 to Length(DBList) - 1 do
begin
cxCombobox1.Properties.Items.Add(DBList[I]);
end;
end;
这个工作正常。我的数据库列表显示在cxCombobox1。
在第二个cxCombobox中,我填充了属于数据库的表名 显示在cxCombobox1中。
procedure TForm1.cxComboBox1PropertiesChange(Sender: TObject);
var
TABLES: TStringList;
i: integer;
begin
if ABSTable1.Active = True then
ABSTable1.Close;
cxComboBox2.properties.Items.Clear;
TABLES := TStringList.Create;
ABSDatabase1.DatabaseFileName:=cxCombobox1.Text;
try
ABSDatabase1.Open;
ABSDatabase1.GetTablesList(TABLES);
for i:= 0 to TABLES.Count-1 do
cxComboBox2.properties.Items.Add(TABLES[i]);
finally
TABLES.free;
end;
end;
这基本上可行。在cxComboBox1中选择数据库会填充cxComboBox2 与相关的表格。
所以一般的想法是在cxComboBox2中选择时打开表。 我做了:
procedure TForm1.ABSTable1BeforeOpen(DataSet: TDataSet);
begin
ABSTable1.DatabaseName:= ABSDatabase1.DatabaseName;
ABSTable1.TableName := cxComboBox2.Text;
end;
关于我做过的combobox2更改事件:
procedure TForm1.cxComboBox2PropertiesChange(Sender: TObject);
begin
cxGrid1DBTableView1.ClearItems;
ABSTable1.Open;
cxGrid1DBTableView1.DataController.CreateAllItems;
end;
这没关系。但只有当我从所选数据库(combobox1)打开表时 在combobox2中显示。 假设我打开了表,然后在combobox1中选择另一个数据库 我收到错误“Missing ABSTable1.Tablename”!
我在这里缺少什么?我的桌名丢失了哪里? 如果我用一个按钮替换更改事件中的combobox2:
procedure TForm1.cxButton2Click(Sender: TObject);
begin
if ABSTable1.Active = True then
ABSTable1.Close;
cxGrid1DBTableView1.ClearItems;
ABSTable1.Open;
cxGrid1DBTableView1.DataController.CreateAllItems;
end;
然后一切正常......
答案 0 :(得分:1)
这是因为您在Items.Clear()
中致电cxComboBox1PropertiesChange
,这会引发更改事件,从而导致调用cxComboBox2PropertiesChange
。
您应该在任何更新之前使用Items.BeginUpdate()
并在完成更新后使用Items.EndUpdate()
以避免在每个更新的步骤/项目上引发事件。