我写了一个简单的方法来对 TDBGrid 中的列进行排序。如果 Option.RowSelect 设置为 False 一切正常,但如果 RowSelect 为 True 则水平位置滚动不会在排序列后恢复。所以我尝试 GetScrollPos 和 SetScrollPos 来恢复水平滚动位置,滚动条到正确的位置但 TDBGrid 没有滚动,这里是方法:
procedure TDBGrid.TitleClick(Column: TColumn);
var
CurrenctPosition: TBookmark;
PosScroll: Integer;
begin
inherited TitleClick(Column);
if FAllowTitleClick and (Assigned(DataSource))
and (Assigned(DataSource.DataSet))
and (DataSource.DataSet.Active)
and (Assigned(Column.Field))
and (Column.Field.FieldKind <> fkLookup) then
begin
//Get position scroll
PosScroll := GetScrollPos(Handle, SB_HORZ);
CurrenctPosition := DataSource.DataSet.GetBookmark;
FPaintInfo.ColPressed := False;
FPaintInfo.ColPressedIdx := -1;
if ValidCell(FCell) then
InvalidateCell(FCell.X, FCell.Y);
SortColumn(Column);
DataSource.DataSet.GotoBookmark(CurrenctPosition);
//Set position scroll
SetScrollPos(Handle, SB_HORZ, PosScroll, True);//<- need to be refreshed
end;
end;
这可以在循环中使用 Perform(WM_HSCROLL, SB_LINERIGHT, 0) 修复,但这不是一个好主意。有人有更好的解决方案吗?