2016-06-16 8 views
6

Wie kann ich auf eine TDBGrid-Spalte anhand des Namens anstelle von Index zugreifen?Wie kann ich auf eine TDBGrid-Spalte anhand ihres Namens und nicht anhand von Index zugreifen?

Zum Beispiel jetzt verwende ich:

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

aber es wäre viel besser, so etwas wie zu schreiben:

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

In der Zwischenzeit ich für Zyklus verwenden wie in:

Die Verwendung von Spaltenname ist IMO viel besser als Spaltenindex, da der Index häufiger geändert werden kann als der Name.

Irgendeine Idee, wie man es besser einkapseln kann?

+0

Mögliches Duplikat von [Get Column-Objekt für DataSet-Feld] (http://stackoverflow.com/questions/31310442/get-column-object-for-dataset-field) –

+0

Je nachdem, wie die Spalten erstellt werden, können Sie Verwenden Sie direkt das Feld hinter der Spalte, um es sichtbar zu machen oder nicht. Werfen Sie einen Blick auf http://StackOverflow.com/Questions/24527027/proper-way-to-hide-show-columns-on-dbgrid – RBA

Antwort

9

Sie so etwas wie dies versuchen könnte:

Natürlich, wenn Sie eine Version von Delphi verwenden, die Class Helper s zu unterstützen aktuell genug ist, können Sie diese Funktion in eine Class Helper wickeln für TDBGrid, wie diese

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; 

Dann könnten Sie tun, um diese

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

Offensichtlich könnten Sie eine ähnliche Funktion schreiben, die nach dem Titel der Spalte und nicht nach dem FieldName des zugehörigen Felds sucht.

1

Sie könnten eine Zuordnung zwischen Spaltenname und Rasterindex z. als ein Wörterbuch und benutze das. Beachten Sie, dass nicht jede Spalte in einem Dataset notwendigerweise in einem dbgrid sichtbar ist. Darüber hinaus können Felder im Dataset berechnet werden, also vergessen Sie diese nicht. Die sicherste Methode zum Erstellen des Mappings besteht darin, die Spalten des dbgrid zu durchlaufen und ihre Feldnamen zusammen mit dem Spaltenindex zu speichern. Auf diese Weise erhalten Sie keine ungültigen Einträge und jedes Feld, das nicht im Mapping ist, hat keine dbgrid-Spalte.

+1

wäre es besser, wenn Sie einige Beispielcode zeigen könnten .. –

+0

Ja, bitte ich würde wirklich schätzen einen kleinen Beispielcode: Ihr Ansatz ist intresting –

+0

@Fabio: Sie brauchen kein Wörterbuch, wenn Sie die Technik in der anderen Antwort verwenden, und im Gegensatz zu diesem, es ist selbsttragend, weil es immer Spalten finden wird, die tatsächlich existieren. Was ist, wenn Sie ein Wörterbuch erstellen, das irgendwann später eine Spalte entfernt, aber vergessen Sie, das Wörterbuch zu aktualisieren? –

Verwandte Themen