Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TDBCheckBox: .Checked aktualisiert das DataSet nicht (https://www.delphipraxis.net/191671-tdbcheckbox-checked-aktualisiert-das-dataset-nicht.html)

hoika 9. Feb 2017 07:51

TDBCheckBox: .Checked aktualisiert das DataSet nicht
 
Hallo,
wie der Titel schon sagt, folgendes Szenario:

ClientDataSet -> DataSource -> DBCheckBox

Markiere ich selbst die CheckBox, wird das ClientDataSet korrekt aktualisiert,
mache ich das per Code CB.Checked := True, passiert nichts.

Ist das so gewünscht oder ein Bug der VCL?

Jumpy 9. Feb 2017 07:57

AW: TDBCheckBox: .Checked aktualisiert das DataSet nicht
 
Die Frage kann ich jetzt nicht beantworten, aber wenn man's doch im Code macht, könnte man doch einfacher direkt das ClientDatatset-Feld ändern. Dann würde die Checkbox auch autom. als gechecked angezeigt.

hoika 9. Feb 2017 08:57

AW: TDBCheckBox: .Checked aktualisiert das DataSet nicht
 
Hallo,
ah ja, das direkte Setzen des DataSets löste das Problem ;)

Vielen Dank!

Slipstream 10. Feb 2017 08:40

AW: TDBCheckBox: .Checked aktualisiert das DataSet nicht
 
Zitat:

Zitat von hoika (Beitrag 1361132)
Hallo,
wie der Titel schon sagt, folgendes Szenario:

ClientDataSet -> DataSource -> DBCheckBox

Markiere ich selbst die CheckBox, wird das ClientDataSet korrekt aktualisiert,
mache ich das per Code CB.Checked := True, passiert nichts.

Ist das so gewünscht oder ein Bug der VCL?

Wenn du in ein DB-Aware-Komponente eine Änderung machst, wird automatisch das zugeordneten Datasets (oder TQuery oder TTable) in den Modus dsEdit versetzt: MyQuery.State := dsEdit;

Sobald der Datensatzzeiger danach wieder bewegt wird, löst das automatisch ein MyQuery.Post aus, ansonsten muss man das Post selbst ausführen.

Bei Checkboxen, die mit Boolean-Feldern in der Datenbank zusammenhängen, verwenden wir nur selten die DBCheckBox, weil die nicht automatisch auf Änderungen reagiert, sondern sich auf die im zugrundeliegenden Query befindliche Datenmenge bezieht. Am besten, so finde ich, fährt man, wenn man für alle im Programm vorkommenden Datenbank-Zugriffe entsprechende Methoden schreibt, die direkt SQL-Befehle an die Datenbank schicken und entsprechende Aktualisierungsbefehle ausführen (Refresh).

hoika 10. Feb 2017 09:55

AW: TDBCheckBox: .Checked aktualisiert das DataSet nicht
 
Hallo,
ich verwende nie DB-Komponenten.
Ist aber nicht mein Code, ich muss den nur warten.

Slipstream 11. Feb 2017 07:12

AW: TDBCheckBox: .Checked aktualisiert das DataSet nicht
 
Zitat:

Zitat von hoika (Beitrag 1361249)
Hallo,
ich verwende nie DB-Komponenten.
Ist aber nicht mein Code, ich muss den nur warten.

Spricht denn etwas dagegen, die TDBCheckBox durch eine TCheckBox zu ersetzen und die notwendigen Schritte im Code zu implentenieren?

Da wäre zuerst einmal der Code für die Aktualisierung der TCheckBox. Wir lösen das gerne mit einem AfterScroll-Ereignis, das wiederum in der jeweils aktuellen Form ein Ereignis auslöst. Dieses Ereignis, das wir meist im zutändigen Datenmodul deklarieren, weisen wir dann in der aktuellen Form einer Aktualisierungs-Methode zu. Damit ist gewährleistet, daß die TCheckBox immer aktualisiert wird, nachdem sich der Datenzeiger bewegt hat.

Für den umgekehrten Fall der Änderung durch den Anwender verwenden wir in den jeweiligen Forms Update-Methoden, die in der OnClick-Ereignisbehandlung der TCheckBox angesprungen werden.

Mit dieser Vorgehensweise haben wir das Problem für alle Zeiten erledigt.

Nachtrag
Sollte es dir nicht gestattet sein, derartige Änderungen im Code vorzunehmen, könntest du auch auf das OnClick der TDBCheckBox reagieren und schauen, ob sich das zugehörige Dataset nach dem Click auf TDBCheckBox im Editmodus befindet:

Delphi-Quellcode:
if MyDataset.State = dsEdit then
begin
  MyDataset.Post;
end else
if MyTDBCheckBox.Checked <> MyDataset.FieldByName('BooleanFeld').AsBoolean then
begin
  MyDataset.Edit;
  MyDataset.FieldByName('BooleanFeld').AsBoolean := MyTDBCheckBox.Checked;
  MyDataset.Post;
end;
... nur mal so als Denkansatz ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz