2013-03-13 55 views
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; 

我在哪裏出錯了?

感謝

+0

數據源綁定是否對數據集正確?一個簡單的dbgrid.DataSource:= Datasourcexy;應該夠了。 – bummi 2013-03-13 22:34:31

回答

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); 

你可能不希望關閉和打開集全球這樣的,雖然。調用代碼可能會更好。當然,這取決於你的應用需要什麼。

+0

我認爲這將覆蓋潛在的問題(懷疑數據源是不正確的綁定)2.如果考慮改變主/細節結構,那麼數據源的數據集將是致命的。 – bummi 2013-03-13 22:33:09

+0

我不認爲你的觀點2適用(因爲這與問題無關)。第1點可能對或不對;大多數應用程序使用連接到數據感知控件的單個數據源(例如'TDBGrid')。在這種情況下,你會把一個'DataSource'連接到控件並改變'DataSet';我有一個用於dBASE文件的通用查看器(使用Advantage Database Server),它允許您打開並瀏覽任何.dbf文件,並且它將'TableName'分配給'TAdsTable',然後打開表格;網格自動創建必要的列並顯示它。 – 2013-03-13 22:38:15

+0

我不同意,但這會超出框架... – bummi 2013-03-13 22:41:35

5

您可以很容易地在運行時很容易地更改由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使用一個DataSource,因爲它更靈活。

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; 
-1

祕密就在於:

DBGrid1.DataSource.Enabled:= FALSE; ...進行更改... DBGrid1.DataSource.Enabled:= True;

使用D5Pro進行測試