Delphi动态关联DataSource与DataSet填充DBGrid的实现求助
动态切换DBGrid的DataSource和DataSet解决方案
核心思路
把20组DataSource、DataSet与对应客户名称建立映射关系,通过选中的客户名称快速匹配到目标组件,实现DBGrid2的动态关联。
步骤1:建立客户-数据源映射集合
在Form2的创建事件中初始化映射,用字典存储客户名称与对应DataSource、DataSet的配对:
uses System.Generics.Collections; type TForm2 = class(TForm) DtSource01: TDataSource; ADO01: TADODataSet; // 其他19组DataSource和DataSet组件... procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private FCustomerDataMap: TDictionary<string, TPair<TDataSource, TDataSet>>; public property CustomerDataMap: TDictionary<string, TPair<TDataSource, TDataSet>> read FCustomerDataMap; end; procedure TForm2.FormCreate(Sender: TObject); begin FCustomerDataMap := TDictionary<string, TPair<TDataSource, TDataSet>>.Create; // 逐个添加客户与数据源的映射(示例,根据实际客户名称修改) FCustomerDataMap.Add('客户A', TPair<TDataSource, TDataSet>.Create(DtSource01, ADO01)); FCustomerDataMap.Add('客户B', TPair<TDataSource, TDataSet>.Create(DtSource02, ADO02)); // ...依次添加剩余18组客户的映射关系 end; procedure TForm2.FormDestroy(Sender: TObject); begin FCustomerDataMap.Free; // 销毁字典,避免内存泄漏 end;
步骤2:修改DBGrid1双击事件实现动态切换
获取选中的客户名称,从映射集合中匹配对应组件,关联给DBGrid2:
procedure TMain.DBGrid1DblClick(Sender: TObject); var CustomerName: string; TargetDataPair: TPair<TDataSource, TDataSet>; begin CustomerName := DBGrid1.SelectedField.AsString; Form2.Caption := CustomerName; // 尝试从映射中获取客户对应的数据源 if Form2.CustomerDataMap.TryGetValue(CustomerName, TargetDataPair) then begin // 关联DBGrid2的数据源和数据集 DBGrid2.DataSource := TargetDataPair.Key; DBGrid2.DataSource.DataSet := TargetDataPair.Value; // 确保数据集处于激活状态 if not TargetDataPair.Value.Active then TargetDataPair.Value.Open; Form2.Show; end else begin ShowMessage('未找到客户【' + CustomerName + '】对应的数据源配置'); end; end;
关键注意事项
- 客户名称匹配:映射中的客户名称必须与DBGrid1选中的名称完全一致(包括大小写、空格),否则无法匹配。
- 数据集准备:每个DataSet需预先配置好对应客户的数据查询逻辑(比如SQL语句包含客户筛选条件),或已加载好对应数据。
- 内存管理:必须在Form2销毁时释放字典对象,防止内存泄漏。
内容的提问来源于stack exchange,提问作者SHKODRAN
相关产品推荐
相关产品推荐

