2016-06-16 52 views
6

Come posso accedere a una colonna TDBGrid per nome anziché per indice?Come posso accedere a una colonna TDBGrid per nome anziché per indice?

Per esempio, ora uso:

grdInvoiceItems.Columns[2].Visible := False; 

ma sarebbe molto meglio scrivere qualcosa di simile:

grdInvoiceItems.Columns['UnitPrice'].Visible := False; 

Nel frattempo io uso una per il ciclo come in:

for idx := 0 to grdInvoiceItems.Columns.Count - 1 do 
    begin 
    if (
     (grdInvoiceItems.Columns[idx].FieldName = 'UnitPrice') or 
     (grdInvoiceItems.Columns[idx].FieldName = 'Discount') or 
     (grdInvoiceItems.Columns[idx].FieldName = 'SecretCode') 
     ) then 
     grdInvoiceItems.Columns[idx].Visible := False; 
    end; 

L'utilizzo del nome colum è IMO molto meglio indice di colonna tham poiché l'indice è soggetto a modifiche più spesso del nome.

Qualche idea su come incapsularlo meglio?

+0

Possibile duplicato di [Ottieni oggetto colonna per campo DataSet] (http://stackoverflow.com/questions/31310442/get-column-object-for-dataset-field) –

+0

A seconda di come vengono create le colonne, è possibile usa direttamente il campo dietro la colonna per renderlo visibile o meno. Date un'occhiata a http://stackoverflow.com/questions/24527027/proper-way-to-hide-show-columns-on-dbgrid – RBA

risposta

9

Si potrebbe provare qualcosa di simile:

Naturalmente, se si utilizza una versione di Delphi che è abbastanza recente per supportare Class Helper s, si potrebbe avvolgere questa funzione in un Class Helper per TDBGrid, come questo

type 
    TGridHelper = class helper for TDBGrid 
    function ColumnByName(const AName : String) : TColumn; 
    end; 
[...] 

function TGridHelper.ColumnByName(const AName: String): TColumn; 
var 
    i : Integer; 
begin 
    Result := Nil; 
    for i := 0 to Columns.Count - 1 do begin 
    if (Columns[i].Field <> Nil) and (CompareText(Columns[i].FieldName, AName) = 0) then begin 
     Result := Columns[i]; 
     exit; 
    end; 
    end; 
end; 

Poi, si potrebbe fare questo

Col := DBGrid1.ColumnByName('SomeName'); 

Ovviamente, è possibile scrivere una funzione simile che cerca il titolo della colonna, piuttosto che il FieldName del campo associato.

1

È possibile creare un mapping tra il nome della colonna e l'indice della griglia, ad es. come dizionario e usalo. Si noti che non tutte le colonne di un set di dati sono necessariamente visibili in un dbgrid. Inoltre, potrebbero essere presenti campi calcolati nel set di dati, quindi non dimenticarli. Il modo più sicuro per creare il mapping sarebbe quello di scorrere le colonne di dbgrid e memorizzare i nomi dei campi insieme all'indice della colonna. In questo modo non riceverai nessuna voce non valida e qualsiasi campo che non è nella mappatura non ha una colonna dbgrid.

+1

sarebbe meglio se poteste mostrare qualche codice di esempio .. –

+0

Sì, per favore vorrei apprezzo davvero un piccolo codice di esempio: il tuo approccio è interessante –

+0

@Fabio: non hai bisogno di un dizionario se usi la tecnica nell'altra risposta e, a differenza di questo, è autosufficiente perché troverà sempre solo colonne che esiste davvero. Cosa succede se si crea un dizionario, in un secondo momento, si rimuove una colonna ma si dimentica di aggiornare il dizionario? –