解决方法
所需的Columnwidth取决于Grids画布的设置和每个字段的displaytext的mamimum长度.
procedure FitGrid(Grid: TDBGrid); const C_Add=3; var ds: TDataSet; bm: TBookmark; i: Integer; w: Integer; a: Array of Integer; begin ds := Grid.DataSource.DataSet; if Assigned(ds) then begin ds.DisableControls; bm := ds.GetBookmark; try ds.First; SetLength(a,Grid.Columns.Count); while not ds.Eof do begin for I := 0 to Grid.Columns.Count - 1 do begin if Assigned(Grid.Columns[i].Field) then begin w := Grid.Canvas.TextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName).DisplayText); if a[i] < w then a[i] := w ; end; end; ds.Next; end; for I := 0 to Grid.Columns.Count - 1 do Grid.Columns[i].Width := a[i] + C_Add; ds.GotoBookmark(bm); finally ds.FreeBookmark(bm); ds.EnableControls; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin FitGrid(DBgrid1) end;