Entwickler-Ecke
Datenbanken - TcxGrid Spalte mit Checkbox ohne Datenbind einfügen
Micha339 - Mo 24.09.12 13:34
Titel: TcxGrid Spalte mit Checkbox ohne Datenbind einfügen
Hallo zusammen,
ich verwende ein TcxGrid mit Datenbindung. Nun sollen aber aus den eingeblendeten Datensätze welche ausgewählt werden, ohne dass die Zeilen markiert werden sollen, sondern über eine Checkbox. Folglich habe ich eine "Checkbox-Spalte" eingefügt, die nicht an Daten gebunden ist. Nur leider lässt sich der Status einer Checkbox nicht ändern. Ich kann nur einstellen, welchen Standard-Wert die Box bei null-Werten hat und dabei bleibt es nach dem Start des Programms. Weder der Anwender noch per Code kann ich das Verhalten der Checkbox beeinflussen. Ist dem tatsächlich so gewollt?
Grüße
Micha
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Mo 24.09.2012 um 16:54
Nersgatt - Mo 24.09.12 13:50
In dem Fall füge ich immer in das darunter liegende TClientDataset, welches an mein Grid gebunden ist, eine zusätzliche Spalte mit InternalCalc ein. An dieses wird dann die Checkbox gebunden. Dann kann ich hinterher ganz bequem aus dem ClientDataSet auslesen, welche Zeilen ausgewählt wurden.
Micha339 - Mo 24.09.12 15:57
Danke erst einmal. Das brachte mich zumindest auf die Idee, in meinem vorliegenden Fall in der TPgQuery die Postgresql-Abfrage zu erweitern (schließlich dient sie nur der Suche und in DB wird nichts gespeichert):
SQL-Anweisung
1:
| select *, TRUE as auswahl from tabelle |
Einer TDataSource->DataSet ist diese Query zugeordnet. Und diese TDataSource ist einer TcxGridTBTableView zugewiesen.
Die entsprechende TcxGridDBColumn binde ich nun im Designer an "auswahl". Merkwürdig ist hierbei bereits, dass in der Dropdownlist "auswahl" gar nicht enthalten ist. Ich füge es manuell hinzu, aber es wird kein Fehler gemeldet.
Zur Laufzeit aber bleiben die Checkboxes einfach weiterhin deaktiviert und ich kann sie nach wie vor nicht ändern. Die Select-Abfrage ist nicht statisch, sondern kann sich ändern, wobei ich immer ", TRUE as auswahl" hinzufüge. Vielleicht noch Tipps, die mich auf weitere Ideen bringen?
Grüße
Micha
Moderiert von
Narses: B- durch HIGHLIGHT-Tags ersetzt.
bummi - Mo 24.09.12 17:14
Wir hatten mal für solche Zwecke die Fieldclasses für ein Projekt ersetzt, ala
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| ExDefaultFieldClasses: array[TFieldType] of TFieldClass = ( nil, TStringField, TSmallintField, TIntegerField, TWordField, TExBooleanField, ......
function TExBooleanField.GetCanModify: Boolean; begin Result := (FieldKind = fkCalculated) and (not ReadOnly); if not Result then Result := inherited GetCanModify; end;
procedure Register; begin RegisterFields([TExFloatField,TExBCDField,TExBooleanField,TExCurrencyField]);
RegisterComponents('devworx', [TExEditCalcFieldsADODataSet]); end;
initialization BCDFieldClass := @DefaultFieldClasses[ftBCD]; BCDFieldClass^ := TExBCDField;
BooleanFieldClass := @DefaultFieldClasses[ftBoolean]; BooleanFieldClass^ := TExBooleanField; |
würden wir heute nicht mehr tun ....
Ein GetClientDSForDS(aDataset:Tdataset;AditionalFields:TFieldDefArray) liefert das was man braucht, zudem können die dann persistenten Booleans dann problemlos verarbeitet werden
meine Routine hierfür ...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62:
| TMyFieldDef = Record Name: String; Size: Integer; DataType: TFieldType; end;
TFieldDefArray = array of TMyFieldDef;
function GetClientDSForDS(ADataSet: TDataSet; AFieldDefArray: TFieldDefArray; AClientDataSet: TClientDataSet = nil; WithRecords: Boolean = true) : TClientDataSet; var i: Integer; Function NoAutoInc(ft: TFieldType): TFieldType; begin if ft = ftAutoInc then Result := ftInteger else Result := ft; end;
begin
if Assigned(AClientDataSet) then Result := AClientDataSet else Result := TClientDataSet.Create(nil); Result.Close; Result.FieldDefs.Clear;
for i := 0 to ADataSet.FieldCount - 1 do begin Result.FieldDefs.Add(ADataSet.Fields[i].FieldName, NoAutoInc(ADataSet.Fields[i].DataType), ADataSet.Fields[i].Size); end;
for i := 0 to High(AFieldDefArray) do Result.FieldDefs.Add(AFieldDefArray[i].Name, AFieldDefArray[i].DataType, AFieldDefArray[i].Size);
Result.CreateDataSet; for i := 0 to ADataSet.FieldCount - 1 do begin Result.FieldByName(ADataSet.Fields[i].FieldName).DisplayLabel := ADataSet.Fields[i].DisplayLabel; Result.FieldByName(ADataSet.Fields[i].FieldName).Visible := ADataSet.Fields[i].Visible; end;
if WithRecords then begin ADataSet.First; while not ADataSet.Eof do begin Result.Append; for i := 0 to ADataSet.FieldCount - 1 do begin Result.FieldByName(ADataSet.Fields[i].FieldName).Assign(ADataSet.Fields[i]); end; Result.Post; ADataSet.Next; end; end; end; |
Micha339 - Mo 24.09.12 17:50
Danke.
bummi - Mo 24.09.12 18:05
Bitte ... kannst Du damit etwas anfangen ?
Micha339 - Mo 24.09.12 20:04
Ja, werde auch aus einem TDataSet ein TClientDataSet machen. Lösung sieht imho elegant aus.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!