2009-12-22 11 views
1

Je dois changer dynamiquement la position de certaines colonnes dans DBGRid. Disons que je dois placer le numéro de la colonne 21 sur la position 10. J'utilise:Repositionnement de colonnes dans DBGrid dans Delphi

DBGrid.Columns[21].Index:=10; 

Mais, cela change aussi le tableau lui-même, ce qui signifie que la prochaine fois que je veux accéder à cette colonne, je vais devoir écrire DBGrid.Columns [10], cela rend un peu sale, j'ai besoin de mémoriser les positions de toutes les colonnes etc. Existe-t-il un moyen plus facile de repositionner une colonne? Il serait également bon que les index de tableau ne changent pas pendant ce changement de position.

Répondre

6

Une façon simple de résoudre le problème est de ne pas accéder aux colonnes par index mais par nom de champ. Introduire une méthode comme ceci:

function GetColumn(aGrid : TDBGrid; aFieldName : string) : TColumn; 
var 
    I : integer; 
begin 
    for I := 0 to DBGrid.Columns.Count-1 do 
    if aDBGrid.Columns[I].FieldName = aFieldName then 
    begin 
     Result := aDBGrid.Columns[I]; 
     exit; 
    end; 
    Result := nil; 
end; 

L'inconvénient est que vous devez exécuter la boucle à chaque fois que vous avez besoin pour accéder au réseau, ce qui provoque un petit retard, donc si la vitesse est essentielle, vous pourriez envisager d'autres options.

2

Vous avez raison. Vous devez garder une trace de l'emplacement de vos colonnes. Peut-être dans une structure séparée, ou en tant qu'objet descendant dérivé de TCustomGrid.

Je conserve un objet conteneur dans lequel je stocke, entre autres, la taille des colonnes, le type de données qu'ils contiennent, l'ordre de tri, les options de formatage et la position dans la grille. Et puis j'ai une grille personnalisée qui fait référence au conteneur.

type 
    TpaGrid = class; 
    TpaColumnType = (ctText,ctDateTime,ctNumber,ctSize,ctPic,ctFileName); 

    TpaColumn = class(TCollectionItem) 
    private 
    FCaption: string; 
    FTitleFont: TFont; 
    FTitleAlignment: TAlignment; 
    FDataType : TPaColumnType; 
    FWidth: Integer; 
    FFont: TFont; 
    FColor: TColor; 
    FBackColor: TColor; 
    FAltBackColor: TColor; 
    FAlignment: TAlignment; 
    FPosition : integer; 
    FSortOrder : integer; // 0=no sort, 1=first, 2=second, etc... 
    FSortAscending : boolean; 
    // .... and many other interesting attributes 
    public 
    // ... published properties 
end; 

TpaColumnClass = class of TPaColumn; 

TpaColumns = class(TCollection) 
    private 
    FGrid: TPaGrid; 
    // ... Getters and Setters, exposing the items as columns 
    public 
    constructor Create(grid:TPaGrid; ColumnClass: TPaColumnClass); 
    function AddColumn: TPaColumn; 
    // ... Load and Save procedures 
    // ... published properties 
end; 

TpaGrid = class (TStringGrid) 
    // ... overriden methods WMSize, DrawCell, ... 
    // ... getters and setters 
    private 
    FColumns : TpaColumns; 
    // ... 

end;

1

Quoi qu'il en soit, pour ceux (comme moi) qui a atteint cette page à la recherche d'un moyen de réorganiser les colonnes dans une grille:

type 
    THackAccess = class(TCustomGrid); 

procedure TCustomGrid_MoveColumn(grid: TCustomGrid; fromCol, toCol: integer); 
begin 
    THackAccess(grid).MoveColumn(fromCol+1, toCol+1); 
end; 

colonnes d'entrée sont basés sur zéro.

Questions connexes