Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBComboBox (https://www.delphipraxis.net/56066-dbcombobox.html)

needatip 31. Okt 2005 15:37

Datenbank: SQL Server • Zugriff über: ADO

DBComboBox
 
Habe Probleme beim Speichern von DBComboBox Einträgen.
Ich möchte die Einträge von DBComboBox.Items auswählen, die dann in der Table1 abgespeichert werden.
Wie schaffe ich es nun ohne einen zusätzlichen Button, dass beim Auswählen der DBComboBox die entspr. Einträge gespeichert werden und der User nicht unabsichtlich die Formulardaten ändern kann - also mit DS1.Autoedit := false beim OnActivate Ereignis des Formulars.

DS1.AutoEdit := true;
..dann Auswahl mit der DBComboBox tätigen...
DS1.AutoEdit := false;

Welche Ereignisse muss ich nun benutzen ?
(Hab momentan den Kopf nicht frei)

marabu 31. Okt 2005 15:46

Re: DBComboBox
 
Wenn der Benutzer seine Auswahl in der DBComboBox getroffen hat, dann erfährst du das im Ereignis OnChange() der Komponente.

Grüße vom marabu

needatip 31. Okt 2005 16:46

Re: DBComboBox
 
Ok, hab mich vielleicht nicht richtig ausgedrückt.
Ich habe im OnChange-Ereignis nur:
Table1.Post drinstehen. Wenn ich dann woanders im Formular klicke bekomme ich die Fehlermeldung, dass die Datenmenge weder im Editier noch Einfügemodus ist.

JohannesK 31. Okt 2005 17:00

Re: DBComboBox
 
Du solltest die Tabellezeile vollständig bearbeiten:

table1.edit;
table1.fieldbyname('dfdf').asstring := dblookup.lookupvalue;
table1.post;

needatip 31. Okt 2005 17:12

Re: DBComboBox
 
Das ist eine DBComboBox.
Etwa so
table1.edit;
table1.fieldbyname('dfdf').asstring := dbcomboBox1.items.text; (oder so)
table1.post;

Ich hab gedacht das macht die ComboBox Komponente automatisch !
Ist heute einfach nicht mein Tag.

JohannesK 31. Okt 2005 17:44

Re: DBComboBox
 
Sorry, ich bin von einer normalen combobox ausgegangen.

Eine dbcombobox macht das automatisch, dann brauchst Du aber auch kein post, daher kommt die Fehlermeldung.

marabu 31. Okt 2005 18:35

Re: DBComboBox
 
Hallo needatip,

Zitat:

Zitat von needatip
Ich habe im OnChange-Ereignis nur Table1.Post drinstehen. Wenn ich dann woanders im Formular klicke bekomme ich die Fehlermeldung, dass die Datenmenge weder im Editier noch Einfügemodus ist.

das ist verständlich. Durch den Wechsel des Satzzeigers verliert die Table ihren Edit-Status. Anschließend wird das Ereignis OnChange gefeuert, weil ja der Wert aus einem anderen Datensatz angenommen wird. Das erneute Post() wirft dann eine Exception.

Ich habe jetzt länger darüber nachgedacht, was deine eigentliche Anforderung sein könnte und bin immer noch nicht sicher, ob ich es weiß. Möchtest du vielleicht, dass eine Änderung am Datensatz grundsätzlich und ohne Zutun des Benutzers gespeichert wird? Das erreichst du vielleicht am ehesten im BeforeCancel Ereignis des DataSets - allerdings zu dem Preis, dass der Benutzer keine Änderungen mehr verhindern kann.

Ein Wort zur Eigenschaft AutoEdit - jede datensensitive Komponente schaltet ihren DataSet in den Edit-Modus, wenn der Benutzer den Inhalt verändert. AutoEdit sorgt dafür, dass der Edit-Modus eingeschaltet wird, noch bevor eine Änderung gemacht wird. Ist das wirklich, was du willst oder war da Verzweiflung im Spiel?

marabu

needatip 1. Nov 2005 06:24

Re: DBComboBox
 
Ja du hast recht.
Ich hab jetzt das Post aus dem OnChange Ereignis genommen und dann einen Button zum posten eingesetzt.
Jetzt funktionierts.
Danke.

Sharky 1. Nov 2005 06:49

Re: DBComboBox
 
Hai needatip,

hast Du schon einmal darüber nachgedacht anstelle der DBComboBox eine "normale" ComboBox zu verwenden?
Ich finde die DBxxxx Komponenten in der Regel zu unflexibel und versuche diese, wo immer es geht, zu vermeiden.

In einer TComboBox könntest Du ja zum Beispiel im Delphi-Referenz durchsuchenOnChange prüfen ob der Anwender einen neuen Eintrag ausgewählt hat und diesen dann mit einem Query in die Tabelle schreiben.

Delphi-Quellcode:
  old_CBValue: string;

procedure TForm1.cb_TestChange(Sender: TObject);
var
  cur_CBValue: string;
begin
  cur_CBValue := cb_Test.Items[cb_test.ItemIndex];
  if (old_CBValue <> cur_CBValue) then
  begin
    // Speichere cur_CBValue in der Tabelle
    old_CBValue := cur_CBValue;
  end;
end;

needatip 1. Nov 2005 08:47

Re: DBComboBox
 
Ok, diese Version gefällt mir sehr gut.
Werde diese gleich mal probieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:11 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