在运行时重新分配数据源

时间:2013-03-13 21:46:42

标签: delphi tdbgrid

我做了一些搜索,但发现了更多未解答的问题。 :)

使用D5pro。

我想在运行时将DataSource重新分配给TDBGrid。我有七个相同的结构化数据集,根据按钮单击,我希望在网格中显示相应的数据集。

我已尝试过所有内容,但我无法让它显示下一个DataSet。它坚持在启动时分配的第一个。我正在采取过度杀伤方法,但仍然没有任何工作。这就是我现在所处的位置。

procedure SetSource(var aSrc : TDataSource);
begin
  aSrc.DataSet.Close;
  dbgridShowData.DataSource:=aSrc;
  aSrc.DataSet.Open;
  aSrc.DataSet.First;
  aSrc.DataSet.Refresh;
end;

我哪里错了?

由于

4 个答案:

答案 0 :(得分:6)

您可以非常轻松地在运行时轻松更改DBGrid显示的数据集。有两种方法:

1:使用分配给DBGrid.DataSource的单个DataSource,并将DataSource.DataSet更改为所需的DataSet。这是一个简单的示例,其中包含在运行时进行的所有分配。

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGrid1.DataSource := DataSource1;

  DataSet1.Active := true;
  DataSet2.Active := true;
  DataSet3.Active := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DataSource1.DataSet := DataSet1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DataSource1.DataSet := DataSet2;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  DataSource1.DataSet := DataSet3;
end;

2:为每个DataSet使用DataSource,并将DBGrid.DataSource更改为所需的DataSource。这是一个简单的示例,其中包含在运行时进行的所有分配。

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataSource1.DataSet := DataSet1;
  DataSource2.DataSet := DataSet2;
  DataSource3.DataSet := DataSet3;

  DataSet1.Active := true;
  DataSet2.Active := true;
  DataSet3.Active := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DBGrid1.DataSource := DataSource1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DBGrid1.DataSource := DataSource2;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  DBGrid1.DataSource := DataSource3;
end;

如果定义DBGrid的列,则DataSet的结构必须相同,否则在更改显示的数据集时必须更改列定义。

我更喜欢每个DataSet使用一个DataSource,因为它更灵活。

答案 1 :(得分:3)

您可能需要更改DataSource.DataSet

procedure SetDataFromDataSet(const aDataSource: TDataSource;
  const aNewDataSet: TDataSet);
begin
  aDataSource.DataSet.Close;
  aDataSource.DataSet := aNewDataSet;
  if not aNewDataSet.Active then
    aNewDataSet.Open;
end;

样品使用:

SetDataFromDataSet(DataSource1, CustomerQuery); 

但是,您可能不希望像这样全局关闭和打开数据集。从调用代码执行此操作可能更好。当然,这取决于您的应用需要什么。

答案 2 :(得分:1)

使用Delphi5专业测试。

procedure TForm1.setDataSourceDataSet(var newDataSource:TDataSource);
begin
if DBgrid1.DataSource = nil then begin
   DBgrid1.DataSource:=newDataSource;
end else begin
if DBgrid1.DataSource.Name = newDataSource.Name then exit;
DBGrid1.DataSource.Enabled:=False;
DBgrid1.DataSource:=newDataSource;
end;
If DBgrid1.DataSource.DataSet.active=False then DBgrid1.DataSource.DataSet.active:=True;
DBGrid1.DataSource.Enabled:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
setDataSourceDataSet(DataSource1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
setDataSourceDataSet(DataSource2);
end;

答案 3 :(得分:-1)

秘密在于:

DBGrid1.DataSource.Enabled:= FALSE; ......做出改变...... DBGrid1.DataSource.Enabled:= TRUE;

使用D5Pro进行测试