Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi DevExpress Grid: Selection (https://www.delphipraxis.net/195742-devexpress-grid-selection.html)

haentschman 21. Mär 2018 10:34

DevExpress Grid: Selection
 
Hallöle...:P

Ich habe ein Grid mit MultiSelect. Ich möchte die Datensätze mit CTRL und/oder SHIFT markieren... soweit so gut. :P

Einschränkung:

Manche Datensätze dürfen nicht markiert werden! Im OnCanSelectRecord wird AAllow entsprechend der Bedingung auf False gesetzt. Auch gut...
Aber:
Mit SHIFT werden, trotz AAllow = False, alle Datensätze markiert? :gruebel:

Hat jemand eine Idee?

Danke...8-)

HeZa 21. Mär 2018 11:23

AW: DevExpress Grid: Selection
 
Hallo,

ich mache erst seit ein paar Tagen etwas mit TcxGrid, daher nur ein paar Fragen, mit denen du dein Problem evtl. einkreisen könntest:
  • Wird OnCanSelectRecord überhaupt für alle Datensätze beim markieren mit Shift aufgerufen?
  • Evtl. sehen die Datensätze nur selektiert aus? Prüfe einmal, ob ForAllSelected auch die nicht gewünschten Sätze berücksichtigt.
  • Mit dem DevExpress-Support das Problem klären (und die Antwort auch hier posten :-) )

haentschman 21. Mär 2018 11:41

AW: DevExpress Grid: Selection
 
Danke...:P
Zitat:

Wird OnCanSelectRecord überhaupt für alle Datensätze beim markieren mit Shift aufgerufen?
...ja. AAllow wird korrekt gesetzt. :?
Zitat:

Evtl. sehen die Datensätze nur selektiert aus?
...nein. Alle Datensätze sind in der Selection enthalten. :? ...auch die die mit AAllow = False.
Zitat:

Mit dem DevExpress-Support das Problem klären (und die Antwort auch hier posten )
Werde ich dann mal machen müssen. 8-) Die wollen aber immer ein Testprojekt...für solchen "Firlefanz" habe ich keine Zeit. :lol:

ULIK 21. Mär 2018 16:00

AW: DevExpress Grid: Selection
 
Na ja, so ganz ohne Testprojekt wirst nicht davonkommen: hab mir mal ein sehr einfaches gebaut und siehe da: Auch bei Markierung mit Shift ist der spezielle Record nicht selektiert.

Was hab ich gemacht: TableView mit
OptionsSelection.CellSelect = False
OptionsSelection.MultiSelect = True

Selektierst Du über irgendwelche Gruppierungen hinweg? Wenn ja, könnte der OnCanSelectRecord dann eventuell mit dem falschen Datensatz arbeiten?

StepByStep 22. Mär 2018 07:52

AW: DevExpress Grid: Selection
 
Moin zusammen,

ich habe gerade das selbe Problem wie der Threadersteller und habe einmal gedebuggt, aber erst einmal kurz der Aufbau des Testprojekts:

Ich habe ein TcxGrid und eine TcxGridDBTableView. Die Daten kommen über ein TADODataSet. Meine Options der TableView sind die gleichen wie von ULIK.

Problembeschreibung:

Im Grid stehen drei Datensätze, einer davon müsste nach dem OnCanSelectRecord herausfallen, auf Grund folgender Bedingung...

Delphi-Quellcode:
if qTest.FieldByName('TEST_ANZAHL').AsInteger < 1 then
begin
  AAllow := False;
end;
... und folgender Datenbasis

TEST_ID / TEST_ANZAHL
1 / 2
2 / 1
3 / 0

Wird jetzt der oberste Satz angeklickt, funktioniert die Selektion. Ebenso bei Datensatz 2 und beim letzten nicht, da die Bedingung das ausschließt. Wählst du aber über STRG + SHIFT + Klick eine Datenmenge aus, dann gehst du so oft durch das OnCanSelectRecord-Event wie du Datensätze zusätzlich zum aktuellen Fokus ausgewählt hast. Soll heißen, wenn Datensatz 1 den Fokus hat und du wählst alle aus, dann läufst du für ID 2 und 3 nochmal durch das Event.

Jetzt kommt aber der Gag an dem Ganzen: In meinem Fall ändert sich natürlich nicht der Satz im DataSet, sondern der steht in beiden Durchläufen auf ID 3. Würde es also einen Datensatz 4 geben, der die If-Bedingung erfüllt, dann würde Datensatz 3 selektiert werden.

Ich hoffe das war so erstmal verständlich. Wenn du keine DB-Anbindung hast, musst du sonst nochmal genauer schildern was du alles hast. Bin relativ fit mit DevExpress, nutze ich nämlich täglich, da lernt man dann das ein oder andere. ;-)

LG

Jan

PS.: Ich habe keine Ahnung wie ich die Tabelle hübsch gestalten kann. Verzeiht mir.

haentschman 22. Mär 2018 08:01

AW: DevExpress Grid: Selection
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin...:P
Das ist die Lösung. :P Aber verstehen muß ich das nicht...
Zitat DevExpress:
Delphi-Quellcode:
procedure <AForm>.<AcxGridDBTableView>CanSelectRecord(Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; var AAllow: Boolean);
var
  AView: TcxGridDBTableView;
  AColumn: TcxGridDBColumn;
begin
  AView := TcxGridDBTableView(Sender);
  AColumn := AView.GetColumnByFieldName(<AFieldName>);

  AAllow := ARecord.Values[AColumn.Index] < 0; // Werteermittlung für den Vergleich aus dem Record
end;
Bild: Selection mit SHIFT

StepByStep 22. Mär 2018 08:16

AW: DevExpress Grid: Selection
 
Moin.

Die Frage ist ja jetzt was du genau stehen hattest, dass es nicht funktioniert.

In deinem Sample ist es so, dass der Record anders als zum DataSet sich in den Durchläufen ändert. Über den Index deiner Spalte kannst du dann auf den jeweiligen Wert innerhalb des Records zugreifen und diesen prüfen.

LG

Jan

Bentissimo 22. Mär 2018 08:29

AW: DevExpress Grid: Selection
 
Hallo zusammen,

aus der Ticket-Beschreibung bei DevExpress würde ich tippen, dass die Abfrage auf "EditValue" nicht korrekt ist. Nur so aus dem Kopf, da ich gerade kein cxGrid vor mir habe. :stupid:

haentschman 22. Mär 2018 08:39

AW: DevExpress Grid: Selection
 
Moin...:P
Der Ursprungscode:
Delphi-Quellcode:
procedure TfoAssignment.GridDBTableViewCanSelectRecord(Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; var AAllow: Boolean);
var
  View: TcxGridDBTableView;
begin
  View := TcxGridDBTableView(Sender);
  AAllow := ContainsText(View.GetColumnByFieldName('ixBELArt').EditValue, conAllowedDocumentType); // nicht bei SHIFT!!!!
end;

StepByStep 22. Mär 2018 10:46

AW: DevExpress Grid: Selection
 
Also die View ist jedes Mal wo du da reinkommst identisch, ebenso die Spalte. Den Wert liest du dann aber eben nicht aus dem aktuellen Record, sondern dieser wird immer den Wert der in dem angeklickten Datensatz steht. Somit läufst du x-Mal dadurch und schaust jedoch immer auf den selben Wert.

So würde ich mir das ohne es gedebuggt zu haben mal erschließen. ^^

LG

Jan

Delphi.Narium 22. Mär 2018 13:41

AW: DevExpress Grid: Selection
 
Ich finde das Beispiel (obwohl ich die Komponenten überhaupt nicht kenne und nie genutzt habe) sehr verständlich (interpretiere mal ziemlich frei):
Delphi-Quellcode:
procedure <AForm>.<AcxGridDBTableView>CanSelectRecord(Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; var AAllow: Boolean);
var
  AView: TcxGridDBTableView;
  AColumn: TcxGridDBColumn;
begin
  AView := TcxGridDBTableView(Sender); // Das Grid für 'nen einfachen Zugriff.
  AColumn := AView.GetColumnByFieldName(<AFieldName>); // Die Spalte, die wir zum Vergleich heranziehen wollen.
  // ARecord ist der Datensatz, der geprüft werden soll (und nicht der, der angeklickt wurde).
  // AColumn.Index gibt die Position der Spalte an, welche im ARecord geprüft werden soll.
  AAllow := ARecord.Values[AColumn.Index] < 0; // Hier die Bedingung prüfen.

  // Aber:
  // Hier wird der Wert geprüft, der "zufällig" zuletzt den Focus zum Editieren hatte.
  // Der muss weder zum zu prüfenden Datensatz (ARecord) gehören, noch schon in der Datenbank stehen.
  AAllow := ContainsText(View.GetColumnByFieldName('ixBELArt').EditValue, conAllowedDocumentType);
end;

haentschman 23. Mär 2018 06:14

AW: DevExpress Grid: Selection
 
Moin...8-)
Zitat:

Den Wert liest du dann aber eben nicht aus dem aktuellen Record, sondern dieser wird immer den Wert der in dem angeklickten Datensatz steht.
...dann erkläre mal das:
Zitat:

Alle Datensätze sind in der Selection enthalten. ...auch die die mit AAllow = False.
Im Original Code werden ALLE die nicht gewünscht worden sind, beim Durchlauf mit AAllow = False (Bedingung = True) gekenzeichnet...aber trotzdem selektiert.
8-)

StepByStep 23. Mär 2018 07:16

AW: DevExpress Grid: Selection
 
Moin.

Puh... vielleicht besuche ich nochmal den Deutschgrundkurs... ^^

Back2Topic:

Gehen wir mal davon aus, dass folgende Daten in deinem Grid stehen:

ixBELArt
1
5
4
-1
0

In deine Anwendung markierst du nun den obersten Datensatz und machst dann STRG + SHIFT + Klick auf den vorletzten Datensatz. Was passiert ist, dass du vier mal durch dein OnCanSelectRecord-Event läufst, nämlich in der Theorie für 1, 5, 4 und -1. Im Sample von DevExpress ist es wie Delphi.Narium es vollkommen richtig beschrieben hat. ARecord ist der zu prüfende Datensatz und eben nicht der letzte der angeklickt wurde. Das ist DER Unterschied zu deinem Code.

Delphi-Quellcode:
procedure TfoAssignment.GridDBTableViewCanSelectRecord(Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; var AAllow: Boolean);
var
  View: TcxGridDBTableView;
begin
  // Du holst dir zuerst die View, die ja immer gleich ist und sich nicht ändert!
  View := TcxGridDBTableView(Sender);
  // Du prüfst hier nun aber eben nicht jeden einzelnen Datensatz, sondern nur den letzten angeklickten, weil der Fokus auf den Record sich nie ändert!
  AAllow := ContainsText(View.GetColumnByFieldName('ixBELArt').EditValue, conAllowedDocumentType);
end;
Wenn du dir einen Haltepunkt in dieses Event setzt und debuggst wirst du genau dieses Szenario feststellen können. In meinem Beispiel oben würde
Delphi-Quellcode:
View.GetColumnByFieldName('ixBELArt').EditValue
immer -1 haben! Du musst, da führt nichts dran vorbei, ARecord nutzen, damit du alle zu selektierenden Datensätze prüfst und eben nicht nur den letzten fokussierten.

Dazu nochwas bezogen auf mein Beispiel. Stell dir mal folgenden Quellcode vor:

Delphi-Quellcode:
procedure TfoAssignment.GridDBTableViewCanSelectRecord(Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; var AAllow: Boolean);
var
  View: TcxGridDBTableView;
begin
  View := TcxGridDBTableView(Sender);
  AAllow := ContainsText(View.GetColumnByFieldName('ixBELArt').EditValue, '-1');
end;
Wenn wir jetzt den obersten Datensatz "1" anklicken, dann wird dieser nicht selektiert, hat aber den Fokus! Würden wir jetzt STRG + SHIFT + Klick auf den vorletzten Datensatz machen "-1", dann laufen wir vier mal durch das Event und EditValue ist immer -1, da die Zeile nun den Fokus hat. AAllow würde also nur für diesen Datensatz gelten, alle anderen würden pauschal mit selektiert! Machen wir aber einen STRG + SHIFT + Klick auf die letzte Zeile mit dem Wert "0" würde es dafür sorgen, dass wir fünf mal dadurch laufen aber immer mit EditValue = 0. Was passiert? Alle Datensätze werden nicht selektiert, weil '0' ja nicht in '-1' ist (Containstext).

Ich hoffe das war nun verständlich, ansonsten frag einfach. :)

LG

Jan

haentschman 23. Mär 2018 09:59

AW: DevExpress Grid: Selection
 
Moin...:P
Zitat:

Ich hoffe das war nun verständlich, ansonsten frag einfach.
...aber sicher doch. :P

Frage:
Wie erklärst du, daß von 5 gewählten Datensätzen 2 rausfallen sollen, im OnCanSelect Record (5x) 2 Stück mit AAllow = False gekennzeichnet werden? Das sollte nach deiner Meinung
Delphi-Quellcode:
(View.GetColumnByFieldName('ixBELArt').EditValue)
komplett True oder Komplett False sein...weil sich der Datensatz nicht ändert?
Zitat:

In meinem Beispiel oben würde View.GetColumnByFieldName('ixBELArt').EditValue immer -1 haben!
...eben nicht. Sonst hätte ich das gemerkt. Aber der Debugger sagte was anderes. :wink:

:wink: An dieser Stelle gebe ich auf...

StepByStep 23. Mär 2018 12:26

AW: DevExpress Grid: Selection
 
Also jetzt wird das ja interessant. :)

Ich habe in meinem Testprojekt das OnCanSelectRecord-Event implementiert und habe die von mir genannte Bedingung geprüft. In allen Durchläufen ist die EditValue immer -1 gewesen, weil eben die Column die da zurückkommt die Fokussierte war... Genau so wie du es wiedergegeben hast.

Dieses Handling was ich da beschrieben habe, kommt ja direkt von der Komponente. Bist du dir sicher, dass du ein TcxGrid und eine TcxGridDBTableView verwendest?

Ansonsten... ja, bin ich glaube ich ratlos. So wie es bei mir hier läuft ist es jedenfalls "richtig" und auch sinnvoll. Warum die EditValue sich bei dir dann zwar ändert und AAllow aber nichts bewirkt, verstehe ich nicht ohne das direkt vor Augen zu haben.

Sorry! :oops:

LG

haentschman 23. Mär 2018 13:28

AW: DevExpress Grid: Selection
 
Danke...:P
Kein Problem. Ist ja gelöst. Die Devexpress Lösung funktioniert ja. Das Wochenende ist gerettet. Die nächste Frage habe ich schon...:wink:
Zitat:

dass du ein TcxGrid und eine TcxGridDBTableView verwendest?
...ja. :wink:


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