AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DevExpress cxGridView Daten auslesen

Ein Thema von Alfredo · begonnen am 19. Apr 2009 · letzter Beitrag vom 24. Apr 2009
Antwort Antwort
Seite 1 von 3  1 23      
Alfredo

Registriert seit: 4. Mär 2008
Ort: München
264 Beiträge
 
Delphi 11 Alexandria
 
#1

DevExpress cxGridView Daten auslesen

  Alt 19. Apr 2009, 11:04
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
  Mit Zitat antworten Zitat
Thomas Horstmann

Registriert seit: 25. Apr 2007
86 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: DevExpress cxGridView Daten auslesen

  Alt 20. Apr 2009, 02:22
Hallo,

die Werte im Grid kann man über den "DataController" auslesen und ändern:

Delphi-Quellcode:
...
MyGridView.DataController.Values[Zeilennummer,MeineSpalte.Index] := 4711 ;
...
Die aktuelle angezeigten Werten werden mit "ViewData" bearbeitet. Der
Unterschied ist notwendig, da evtl. Filter gesetzt sind.

MyGridView.ViewData.Records[Zeilennummer].Values[MeineSpalte.Index] := 4711 ; Ggf. ist es besser den abhängigen Wert via "BeforePost" im DataSet
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 ;
...
  Mit Zitat antworten Zitat
Alfredo

Registriert seit: 4. Mär 2008
Ort: München
264 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: DevExpress cxGridView Daten auslesen

  Alt 20. Apr 2009, 11:44
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:
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;
Gruß
Alfred
  Mit Zitat antworten Zitat
Thomas Horstmann

Registriert seit: 25. Apr 2007
86 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: DevExpress cxGridView Daten auslesen

  Alt 20. Apr 2009, 12:39
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:
...
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 ;
...
Code im GridView:

Delphi-Quellcode:
procedure TGlobal_EditFields_Form.GridDBViewEditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
begin
PostMessage(Handle, WM_GRIDPOSTMESSAGE, Integer(Sender), 0) ;
end ;
Hinweis:
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
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#5

Re: DevExpress cxGridView Daten auslesen

  Alt 20. Apr 2009, 12:53
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;
Uli Gerhardt
  Mit Zitat antworten Zitat
Alfredo

Registriert seit: 4. Mär 2008
Ort: München
264 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: DevExpress cxGridView Daten auslesen

  Alt 20. Apr 2009, 21:55
Hallo Tom,

ich versuche gerade deinen Code nachzuvollziehen und stolpere bereits zu Beginn.

Delphi-Quellcode:
public
  procedure ApplicationMessage
  (var MSg : TMsg ;
   var Handled : Boolean);
end;
liefert: E2065 Ungenügende Forward -oder External-Deklartion.



Gruß
Alfred
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: DevExpress cxGridView Daten auslesen

  Alt 20. Apr 2009, 22:00
Hast du auch die Implementierung übernommen?
Markus Kinzler
  Mit Zitat antworten Zitat
Thomas Horstmann

Registriert seit: 25. Apr 2007
86 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: DevExpress cxGridView Daten auslesen

  Alt 20. Apr 2009, 22:10
Hallo,

Wurde ApplicationMessage richtig auf die Form verwiesen?
In meinem Fall auf "TStart_Form"?

procedure TStart_Form.ApplicationMessage Hier mal ein paar Auszug aus meiner "Start_Form".

Delphi-Quellcode:
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 ************************************************
// *****************************************************************************
...
Viele Grüße
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: DevExpress cxGridView Daten auslesen

  Alt 21. Apr 2009, 06:57
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

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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Alfredo

Registriert seit: 4. Mär 2008
Ort: München
264 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: DevExpress cxGridView Daten auslesen

  Alt 21. Apr 2009, 09:35
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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