根据 DBGrid中插入DateTimePicker(08) 类似 改编
procedure TForm13.ComboBox1Change(Sender: TObject); //ComboBox1 写回 数据库 begin DBGrid1.DataSource.Edit; DBGrid1.Columns[1].Field.Value := ComboBox1.Items[ComboBox1.ItemIndex ]; //1 为 ComboBox1 所在的列序号 fdquery1.Post; end; procedure TForm13.DBGrid1ColExit(Sender: TObject); begin if DBGrid1.SelectedField.FieldName = 'username' then ComboBox1.Visible := False; end; procedure TForm13.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if (gdFocused in State) then begin if (Column.Field.FieldName = 'username') then with ComboBox1 do begin Left := Rect.Left + DBGrid1.Left + 1; Top := Rect.Top + DBGrid1.Top + 1; Width := Rect.Right - Rect.Left + 2; Width := Rect.Right - Rect.Left + 2; Height := Rect.Bottom - Rect.Top + 2; ComboBox1.ItemIndex := ComboBox1.Items.IndexOf( Column.Field.Value); // 从 数据库 中读 并 设置 ComboBox1 Visible := True; end; end end; procedure TForm13.FormCreate(Sender: TObject); var i: Integer; aStringList: Tstringlist; begin FDQuery1.Open('select * from userinfo '); aStringList := Tstringlist.Create; aStringList.Sorted := True; aStringList.Duplicates := dupIgnore; //去重 while not FDQuery1.Eof do begin aStringList.Add(FDQuery1.Fields[1].AsString); // 要从 字典表 中 加载, 这里 只从 数据中 提取 FDQuery1.next; end; ComboBox1.Items.Assign(aStringList); aStringList.Free; end;