缺少的表名属性

时间:2016-11-14 02:18:25

标签: delphi

这让我疯了...... 我获取我的数据库的名称以填充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;

然后一切正常......

1 个答案:

答案 0 :(得分:1)

这是因为您在Items.Clear()中致电cxComboBox1PropertiesChange,这会引发更改事件,从而导致调用cxComboBox2PropertiesChange

您应该在任何更新之前使用Items.BeginUpdate()并在完成更新后使用Items.EndUpdate()以避免在每个更新的步骤/项目上引发事件。