![]() |
DevExpress cxGridView Daten auslesen
Ich möchte den gerade in einem Datagrid eingegeben Wert, der ja noch nicht im Dataset steht
auslesen und aufgrund dieses Wertes in einer anderen Spalten einen Wert hineinschreiben. z.B. im Feld GKTO habe ich 4910 erfasst und in das Feld Buchtext soll 'Porto'. Dass das im EditValueChanged erfolgen muss ist mir klar. Mir fehlt jedoch die Wertabfrage und das Wertwegschreiben im Datagrid. Gruß Alfred |
Re: DevExpress cxGridView Daten auslesen
Hallo,
die Werte im Grid kann man über den "DataController" auslesen und ändern:
Delphi-Quellcode:
Die aktuelle angezeigten Werten werden mit "ViewData" bearbeitet. Der
...
MyGridView.DataController.Values[Zeilennummer,MeineSpalte.Index] := 4711 ; ... Unterschied ist notwendig, da evtl. Filter gesetzt sind.
Delphi-Quellcode:
Ggf. ist es besser den abhängigen Wert via "BeforePost" im DataSet
MyGridView.ViewData.Records[Zeilennummer].Values[MeineSpalte.Index] := 4711 ;
zu setzen. Dabei ist aber zu beachten, dass im "EditValueChanged" kein "Post" direkt abgesetzt werden kann. Das Grid immer noch den Fokus und bekommt dann schon wieder die Aufforderung Daten neu anzuzeigen. In diesem Fall muss der Umweg über die Message gegangen werden. Leider etwas umständlich. ... Application.OnMessage := ApplicationMessage ; ... |
Re: DevExpress cxGridView Daten auslesen
Hallo Thomas,
sowohl .Datacontroller als auch .ViewData geben im EditValueChanged den vorhergehenden Wert und nicht den Wert den man gerade eingegeben hat zurück. Ich verwende momentan folgenden Code:
Delphi-Quellcode:
Gruß
SDQuery1.ApplyUpdates;
SDQuery1.CommitUpdates; SDQuery1.Edit; nread1 := SDQuery1.FieldbyName('GKTO').asInteger; if nread1 = 4910 then begin SDQuery1.FieldbyName('BUCHTEXT').Value := 'Porto'; SDQuery1.ApplyUpdates; SDQuery1.CommitUpdates; SDQuery1.Edit; end; Alfred |
Re: DevExpress cxGridView Daten auslesen
Hallo,
das ist das Problem mit dem "Editor" des Views, der währende der Eingabe alles andere sperrt. Und beim Drücken von "Enter" ist dieser noch aktiv. 1. Die Kunst ist jetzt, den Editor "sauber" zu beenden und dann die gewünschte Aktion auszuführen. 2. Dafür wird nach "EditValueChanged" eine Message abgesetzt. 3. Die Message wird im Hauptfenster verarbeitet. 4. Der Editor schliesst sich vor der Message (zum Glück). 5. Den zusätzlichen Wert würde ich mit "BeforePost" im DataSet holen. Damit steht er gleich an der richtigen Stelle. Sauberer wäre eine Verarbeitung auf der Datenbank z.B. per Trigger (meine Empfehlung). 6. Der Wert "ForceRefresh" sollte im DataSet aktiviert sein, damit alle Spalten neu ausgelesen werden. Ich verwende folgenden Code im Hauptfenster des Projekts:
Delphi-Quellcode:
Code im GridView:
...
public procedure ApplicationMessage ( var Msg : TMsg ; var Handled : Boolean) ; ... const WM_GRIDPOSTMESSAGE = WM_USER + 10000 ; ... procedure TStart_Form.FormCreate(Sender: TObject); begin { Messages abfangen } Application.OnMessage := ApplicationMessage ; end ; ... procedure TStart_Form.ApplicationMessage ( var Msg : TMsg ; var Handled : Boolean) ; var iDataSet : TDataSet ; begin { Grid } if Msg.message = WM_GRIDPOSTMESSAGE then begin iDataSet := TcxGridDBTableView(Msg.wParam).DataController.DataSet ; if iDataSet.State in [dsInsert,dsEdit] then begin iDataSet.Post ; // gGlobalIBConnection.Transaction.CommitRetaining ; end ; end ; end ; ...
Delphi-Quellcode:
Hinweis:
procedure TGlobal_EditFields_Form.GridDBViewEditValueChanged(
Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem); begin PostMessage(Handle, WM_GRIDPOSTMESSAGE, Integer(Sender), 0) ; end ; Wenn der "neue" Wert nicht in der Datenmenge benötigt wird, dann kann der Wert z.B. via "ImageComboBox" angezeigt werden. Dafür muss diese Spalte als "Unbound" deklariert werden. Alternativ geht evtl. auch OnGetText. Viele Grüsse Tom |
Re: DevExpress cxGridView Daten auslesen
Vorneweg: Ich arbeite mit ungebundenen Grids (nix DB), also ist vielleicht nicht alles auf deine Situation übertragbar.
Ich habe ein ähnliches Problem wie du in einem Handler für TableView.DataController.OnRecordChanged gelöst:
Delphi-Quellcode:
procedure TMyGrid.TableViewRecordChanged(
ADataController: TcxCustomDataController; ARecordIndex, AItemIndex: Integer); begin if AItemIndex = InteressanteSpalte.Index then MachWasMit(ARecordIndex, InteressanteSpalte.EditValue); end; |
Re: DevExpress cxGridView Daten auslesen
Hallo Tom,
ich versuche gerade deinen Code nachzuvollziehen und stolpere bereits zu Beginn.
Delphi-Quellcode:
liefert: E2065 Ungenügende Forward -oder External-Deklartion.
public
procedure ApplicationMessage (var MSg : TMsg ; var Handled : Boolean); end; :gruebel: Gruß Alfred |
Re: DevExpress cxGridView Daten auslesen
Hast du auch die Implementierung übernommen?
|
Re: DevExpress cxGridView Daten auslesen
Hallo,
Wurde ApplicationMessage richtig auf die Form verwiesen? In meinem Fall auf "TStart_Form"?
Delphi-Quellcode:
Hier mal ein paar Auszug aus meiner "Start_Form".
procedure TStart_Form.ApplicationMessage
Delphi-Quellcode:
Viele Grüße :-)
unit Start;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, dxSkinsCore ; type TStart_Form = class(TForm) XPManifest: TXPManifest; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private { Private-Deklarationen } public { Public-Deklarationen } procedure QuitApplication ; procedure ApplicationMessage ( var Msg : TMsg ; var Handled : Boolean ) ; end; var Start_Form: TStart_Form; implementation uses ... // *** Start FormCreate/Close/KeyDown ****************************************** // ***************************************************************************** procedure TStart_Form.FormCreate(Sender: TObject); begin { Messages } Application.OnMessage := ApplicationMessage ; end ; // *** Ende FormCreate/Close/KeyDown ******************************************* // ***************************************************************************** ... // *** Start ApplicationMessage ************************************************ // ***************************************************************************** procedure TStart_Form.ApplicationMessage ( var Msg : TMsg ; var Handled : Boolean ) ; var iDataSet : TDataSet ; begin { Grid } if Msg.Message = WM_GRIDPOSTMESSAGE then begin TcxGridDBTableView(Msg.wParam).DataController.DataSet.Post ; end ; end ; // *** Ende ApplicationMessage ************************************************ // ***************************************************************************** ... |
Re: DevExpress cxGridView Daten auslesen
Beim 'Buchungstext' handelt es soch doch um ein simples Lookupfeld, wieso also diese Mühe. Wenn man das entsprechend deklariert, befüllt Delphi das doch ganz alleine :gruebel:
Alternativ kann auch ein OnCalcFields herhalten, aber das wird -glaube ich- erst nach dem Post ausgeführt. die Lösung mit einer Unbound-Spalte zur Anzeige des Buchungstextes funktioniert bei mir nicht, da dieser Wert beim Verlassen der Zeile wieder gelöscht wird. |
Re: DevExpress cxGridView Daten auslesen
Hallo Tom,
hatte einmal Start_Form :(. Jetzt läuft das alles, aber das Problem besteht weiterhin. An welcher Stelle sollte denn der geänderte Wert abgreifbar sein? Gruß Alfred |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz