DGBridEh 如果没有在设计期设计固定字段并设置每个字段的显示宽度,而是运行期打开对应的 DataSet 动态获得字段(列),则可能列宽不足以显示字段名字 -- 字段名字的宽度比显示内容的宽度更宽的情况下。
使用代码动态调整,代码如下:
for i := 0 to DBGridEh2.Columns.Count -1 do
begin
DBGridEh2.Columns[i].Title.Alignment := TAlignment.taCenter;
L := Length(DBGridEh2.Columns[i].Title.Caption) + 2;
W := DBGridEh2.Canvas.TextWidth('A') * L;
W1 := DBGridEh2.Canvas.TextWidth('A') * DBGridEh2.Columns[i].Field.DisplayWidth;
if W < W1 then
W := W1;
DBGridEh2.Columns[i].Width := W;
end;
解释:
1. L 用于取得表头的文字的个数,加 2 是因为两边要预留位置,否则列宽度刚好装下文字,实际上表头文字(Title.Caption)显示不全。
2. W 是计算表头那么多个字符实际在界面上占据的宽度。
3. W1 是计算字段宽度在界面上实际占据的宽度。字段宽度通常是和字段的数据类型有关。
上述代码测试通过。
又及:
1. 如果 Title 用了中文,计算宽度时,DBGridEh2.Canvas.TextWidth('A') 这里最好也用中文,比如: DBGridEh2.Canvas.TextWidth('中')
2. W1 := DBGridEh2.Canvas.TextWidth('A') * DBGridEh2.Columns[i].Field.DisplayWidth; 这句,假设用一个 DBGridEh 来对应多个 DataSet,多次切换,则会越来越宽,大概原因是 DisplayWidth 被修改了导致。这里改为 Field.Size 就不会有问题了。