2013-03-13 3 views
4

Я сделал несколько поисков и нашел только ответы на непонятные вопросы. :)Переназначение источника данных во время выполнения

Использование D5pro.

Я хочу переназначить DataSource TDBGrid во время выполнения. У меня есть семь одинаковых структурированных наборов данных и в зависимости от нажатия кнопки я хочу, чтобы соответствующий DataSet отображался в сетке.

Я пробовал все, и я не могу заставить его показать следующий 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

ответ

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

Я думаю, что это будет 1. охватывать основную проблему (подозрительные источники данных неверны) 2. Если подумать об изменении структуры мастера/детали, тогда набор данных источника данных будет фатальным. – bummi

+0

Я не думаю, что ваш пункт 2 применяется (поскольку это не имеет никакого отношения к заданному вопросу).Пункт 1 может быть или не быть прав; большинство приложений используют один DataSource, подключенный к элементам управления, управляемым данными (например, «TDBGrid»). В этом случае вы оставите один «DataSource», прикрепленный к элементу управления, и измените «DataSet»; У меня есть общий просмотр файлов dBASE (с использованием Advantage Database Server), который позволяет вам открывать и просматривать любой .dbf-файл, и все, что он делает, - это присваивать 'TableName'' TAdsTable', а затем открывать таблицу; сетка автоматически создает необходимые столбцы и отображает их. –

+0

Я не согласен, но это выходит за рамки ... – bummi

5

Вы легко можете легко изменить набор данных, показанный DBGrid, во время выполнения. Существует два подхода:

1: используйте один источник данных, назначенный DBGrid.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: использовать источник данных для каждого набора данных и изменить 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, структура DataSets должны быть одинаковы, или вам придется менять определения столбцов при изменении набора данных отображается.

Я предпочитаю использовать 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

Смежные вопросы