Tôi hy vọng tôi đã hiểu những gì bạn đang yêu cầu, dựa trên cấu trúc của các bảng được hiển thị trong ảnh chụp màn hình của bạn.
Đoạn mã dưới đây cho biết cách thiết lập DBLookUPComboBox để hiển thị một thành phố để chọn cho một người nhất định trong một bảng người. Tôi đã sử dụng TClientDataSets nên thatit được tự động hóa để toàn bộ quá trình thiết lập được thực hiện bằng mã chứ không phải bằng cài đặt thuộc tính trong Trình kiểm tra đối tượng.
Rõ ràng, DBGrid và dbNavigator được kết nối với nguồn dữ liệu dsPerson.
Mã
TForm1 = class(TForm)
cdsCity: TClientDataSet;
cdsPerson: TClientDataSet;
dsPerson: TDataSource;
DBGrid1: TDBGrid;
DBLookupComboBox1: TDBLookupComboBox;
dsCity: TDataSource;
DBNavigator1: TDBNavigator;
procedure FormCreate(Sender: TObject);
end;
[...]
procedure TForm1.FormCreate(Sender: TObject);
var
Field : TField;
begin
Field := TIntegerField.Create(Self);
Field.FieldName := 'CityId';
Field.DataSet := cdsCity;
Field := TStringField.Create(Self);
Field.FieldName := 'City';
Field.Size := 40;
Field.DataSet := cdsCity;
cdsCity.CreateDataSet;
cdsCity.InsertRecord([3, 'Moscow']);
cdsCity.InsertRecord([4, 'Leningrad']);
Field := TIntegerField.Create(Self);
Field.FieldName := 'PersonId';
Field.DataSet := cdsPerson;
Field := TIntegerField.Create(Self);
Field.FieldName := 'CityID';
Field.DataSet := cdsPerson;
Field := TStringField.Create(Self);
Field.FieldName := 'Name';
Field.Size := 40;
Field.DataSet := cdsPerson;
cdsPerson.CreateDataSet;
cdsPerson.InsertRecord([1, 4, 'Ivan']);
cdsPerson.InsertRecord([2, 3, 'Kate']);
DBLookupComboBox1.DataField := 'CityID';
DBLookupComboBox1.DataSource := dsPerson;
DBLookupComboBox1.KeyField := 'CityID';
DBLookupComboBox1.ListField := 'City';
DBLookupComboBox1.ListSource := dsCity;
end;
Lưu ý rằng thay vì (hoặc cũng như) sử dụng DBLookUpComboBox, bạn cũng có thể xác định trường tra cứu trong tập dữ liệu cdsPerson, bằng cách thêm mã bên dưới trước lệnh gọi cdsPerson.CreateDataSet. Nếu bạn làm như vậy, cdsPerson sẽ có thêm một cột CityName. Điều này sẽ hiển thị trong DBGrid - bạn có thể phải cuộn nó sang phải để xem - và nếu bạn nhấp vào một trong các ô CityName, bạn sẽ thấy rằng nó sẽ kích hoạt một danh sách thả xuống tại chỗ mà từ đó một thành phố có thể được chọn, như vậy
Khi bạn chọn một Tên Thành phố khác, ID Thành phố trong hồ sơ Người sẽ tự động được cập nhật.
Field := TStringField.Create(Self);
Field.FieldName := 'CityName';
Field.Size := 40;
Field.DataSet := cdsPerson;
Field.FieldKind := fklookUp;
Field.LookUpDataSet := cdsCity;
Field.LookUpKeyFields := 'CityID';
Field.LookupResultField := 'CityName';
Field.KeyFields := 'CityID';
Nếu tôi hiểu đúng nhận xét của bạn, hãy thử cách này:
-
thêm DBGrid và DBNavigator thứ hai và một DBEdit vào biểu mẫu.
-
đặt tất cả các nguồn dữ liệu của chúng thành dsCity và đặt DataField của DBEdit thành CityName.
Sau đó, bạn có thể thêm Thành phố mới vào bảng Thành phố và chỉ định CityID của nó (trong lưới) và CityName (trong lưới hoặc DBEdit). Lưu ý rằng ngay sau khi bạn lưu nó bằng cách sử dụng DBNavigator thứ hai, bạn có thể nhấp vào ô CityName của lưới Person và CityName mới sẽ nằm trong danh sách thả xuống. Nếu bạn muốn thực hiện việc chỉnh sửa này đối với bản ghi hiện tại của bảng Person, bạn có thể làm điều đó bằng cách thêm trình xử lý sự kiện AfterPost trên bảng City và thêm mã vào bảng đó như sau:
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;