我做了一些搜索,但发现了更多未解答的问题。 :)
使用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;
我哪里错了?
由于
答案 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进行测试