4

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

使用 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

4 回答 4

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 时必须更改列定义。

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

于 2013-03-14T00:33:13.453 回答
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); 

不过,您可能不想像这样在全局范围内关闭和打开数据集。从调用代码中执行此操作可能会更好。当然,这取决于您的应用程序需要什么。

于 2013-03-13T21:53:03.053 回答
1

用 Delphi5 pro 测试。

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;
于 2013-03-14T01:12:46.387 回答
-1

秘诀在于:

DBGrid1.DataSource.Enabled:=False; ...进行更改... DBGrid1.DataSource.Enabled:=True;

用 D5Pro 测试

于 2016-12-08T16:01:23.887 回答