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 cxGrid Anzahl selektierter Datensätze (https://www.delphipraxis.net/169748-cxgrid-anzahl-selektierter-datensaetze.html)

Mazen 9. Aug 2012 09:24

cxGrid Anzahl selektierter Datensätze
 
Ich hoffe hier gibt es einige die sich mit dem Express Quantum Grid auskennen.
Denn genau da liegt grade mein Problem.

Ich habe schon eine Funktion gefunden die mir eigentlich die Anzahl der selektierten Reihen zurückgeben sollte, und zwar tableView.Controller.SelectedRecordCount.

Problem ist nur das mir diese Funktion (und auch alle anderen die ich probiert habe) nur Werte > 1 zurückgeben. Also auch wenn ich als Benutzer kein Datensatz angeklickt habe gibt mir diese Funktion "1" zurück. Wenn ich mehrere makiere gibt sie mir allerdings immer die richtige Zahl mit.

Ich denke das hängt irgendwie mit diesem "internen Pointer" in der Datenmenge zusammen der ja immer auf ein Feld zeigt. (Zu steuern mit First, Last, Next, Previous)
Ich nutze eine SOAPMemTable als Datenquelle und glaube das eben dieser Pointer vom Grid auch als Selektion gewertet wird da nämlich genau der Datensatz, auf dem der Pointer steht etwas grau hinterlegt ist im Grid.

Gibt es eine Möglichkeit zu erkennen wieviele Datensätze wirklich vom Benutzer selektiert worden sind? Also wenn keine Auswahl getroffen wurde auch ein "0" zurückgegeben wird?

Iwo Asnet 9. Aug 2012 10:04

AW: cxGrid Anzahl selektierter Datensätze
 
Ist der fokussierte Datensatz nicht auch immer selektiert?

himitsu 9. Aug 2012 10:11

AW: cxGrid Anzahl selektierter Datensätze
 
Nein, vorallem wenn Multiselect, dann muß das nicht so sein.

Iwo Asnet 9. Aug 2012 10:20

AW: cxGrid Anzahl selektierter Datensätze
 
Doch. :-)

Habe ein TdxMemData (drei zeilen mit testdaten), ein Datasource, ein TcxGrid mit einem DBGridTableView und einen Timer.

Beim Start zeigt mir der Timer, das 0 Reihen selektiert sind.
Klicke ich eine Zeile an dann ist N=1 und die selektierte Zeile wird angezeigt, bewege ich den Fokus mit den Cursortasten, bleibt die eins bestehen und ich sehe auch, welche Zeile selektiert ist.

Hier ein hingerotzter Test.
Delphi-Quellcode:
unit Unit14;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters,
  cxStyles, cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, DB, cxDBData,
  StdCtrls, ExtCtrls, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
  dxmdaset, cxGridLevel, cxClasses, cxGridCustomView, cxGrid;

type
  TForm14 = class(TForm)
    cxGrid1DBTableView1: TcxGridDBTableView;
    cxGrid1Level1: TcxGridLevel;
    cxGrid1: TcxGrid;
    DataSource1: TDataSource;
    dxMemData1: TdxMemData;
    dxMemData1Feld: TStringField;
    cxGrid1DBTableView1RecId: TcxGridDBColumn;
    cxGrid1DBTableView1Feld: TcxGridDBColumn;
    Timer1: TTimer;
    Label1: TLabel;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form14: TForm14;

implementation

{$R *.dfm}

procedure TForm14.Timer1Timer(Sender: TObject);
Var
  i : Integer;
  s : String;
begin
  s := IntToStr(cxGrid1DBTableView1.Controller.SelectedRowCount)+' rows selected: ';
  for I := 0 to cxGrid1DBTableView1.Controller.SelectedRowCount - 1 do
    s := s +  VarToStr(cxGrid1DBTableView1.Controller.SelectedRows[i].Values[0])+', ';

  Label1.Caption := s;
end;

end.
Und die DFM.
Code:
object Form14: TForm14
  Left = 0
  Top = 0
  Caption = 'Form14'
  ClientHeight = 243
  ClientWidth = 527
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 169
    Top = 15
    Width = 31
    Height = 13
    Caption = 'Label1'
  end
  object cxGrid1: TcxGrid
    Left = 146
    Top = 41
    Width = 367
    Height = 200
    TabOrder = 0
    object cxGrid1DBTableView1: TcxGridDBTableView
      NavigatorButtons.ConfirmDelete = False
      DataController.DataSource = DataSource1
      DataController.Summary.DefaultGroupSummaryItems = <>
      DataController.Summary.FooterSummaryItems = <>
      DataController.Summary.SummaryGroups = <>
      OptionsSelection.MultiSelect = True
      object cxGrid1DBTableView1RecId: TcxGridDBColumn
        DataBinding.FieldName = 'RecId'
        Visible = False
      end
      object cxGrid1DBTableView1Feld: TcxGridDBColumn
        DataBinding.FieldName = 'Feld'
      end
    end
    object cxGrid1Level1: TcxGridLevel
      GridView = cxGrid1DBTableView1
    end
  end
  object DataSource1: TDataSource
    DataSet = dxMemData1
    Left = 257
    Top = 126
  end
  object dxMemData1: TdxMemData
    Active = True
    Indexes = <>
    Persistent.Data = {
      5665728FC2F5285C8FFE3F01000000140000000100050046656C640001010000
      0031010100000032010100000033}
    SortOptions = []
    Left = 318
    Top = 107
    object dxMemData1Feld: TStringField
      FieldName = 'Feld'
    end
  end
  object Timer1: TTimer
    Interval = 100
    OnTimer = Timer1Timer
    Left = 267
    Top = 136
  end
end

jensw_2000 9. Aug 2012 10:40

AW: cxGrid Anzahl selektierter Datensätze
 
Kann ist so bestätigen.

Wenn das cxGrid erst einmal den Focus hatte, dann ist der SelectedRowCount bzw. der SecectedRecordCount immer >= 1.
Da hilft die Property "unselectFocusedRecordOnExit) auch nicht weiter.

Der DevExpress Support ist echt Klasse.
Schau doch mal in die DevExpress Website.
Die Frage kam bestimmt schon mal und wurde sicher auch beantwortet.
Falls nicht, mach kurz ein neues Ticket auf.


Alternativ kannst Du ggf. auch eine TcxCheckbox Column als "unbound column" in den TableView einfügen und den Benutzer die zu selektierenden Datensätze einfach per Checkbox auswählen lassen. Dann muss der User nicht auf den Focus des cxGrids achten ...

Mazen 9. Aug 2012 10:44

AW: cxGrid Anzahl selektierter Datensätze
 
Zitat:

Zitat von himitsu (Beitrag 1177464)
Nein, vorallem wenn Multiselect, dann muß das nicht so sein.

Hatte das Multiselect nur kurz an um zu testen ob er mehrere richtig anzeigt. Hat er auch gemacht. Nur hab natürlich nicht getestet ob er mit auch "0" richtig anzeigt... Und das macht er tatsächlich..
Wenn ich Multiselect habe funktioniert es anstandslos. Aber eigentlich wollte ich kein Multiselect zulassen.
Aber auf jedenfall schonmal ein Hinweis. Danke ;)


Zitat:

Zitat von Iwo Asnet (Beitrag 1177466)
Doch. :-)

Habe ein TdxMemData (drei zeilen mit testdaten), ein Datasource, ein TcxGrid mit einem DBGridTableView und einen Timer.

Beim Start zeigt mir der Timer, das 0 Reihen selektiert sind.
Klicke ich eine Zeile an dann ist N=1 und die selektierte Zeile wird angezeigt, bewege ich den Fokus mit den Cursortasten, bleibt die eins bestehen und ich sehe auch, welche Zeile selektiert ist.

Hier ein hingerotzter Test.

Bei mir war aber von anfang an einer selektiert. Auch ohne das ich vorher auch nur ins Grid geklickt hätte :/

Iwo Asnet 9. Aug 2012 10:59

AW: cxGrid Anzahl selektierter Datensätze
 
Na dann wirst Du wohl im Code irgend etwas machen, das eine Zeile selektiert/fokusiert wird, z.B. den Datensatzzeiger des TDatasets bewegen (glaube ich).

Ruf einfach
Delphi-Quellcode:
cxGrid1DBTableView1.Controller.ClearSelection
auf.

PS: SelectedRowCount ist immer 1, wenn MultiSelect nicht an ist.

himitsu 9. Aug 2012 11:01

AW: cxGrid Anzahl selektierter Datensätze
 
Zitat:

Zitat von Iwo Asnet (Beitrag 1177466)
Doch. :-)

Multiselect an und dann Strg+Linksklick, oder Strg+Leertaste auf einen Selektierten.

Schwups, schon ist der Fokusierte nicht selektiert.


Und ansonsten ist, bei allen Komponenten, auch ohne Multiselect das Fokusierte auch selektiert, wenn es dort etwas wie FocusOnSelect gibt.
DevExpress kann z.B. das bei Rechtsklick nicht so behandeln, womit da eventuell für das Kontextmenü zwar der Fokus umgesetzt wird, aber nicht die Selection.

Iwo Asnet 9. Aug 2012 11:03

AW: cxGrid Anzahl selektierter Datensätze
 
Zitat:

Zitat von himitsu (Beitrag 1177479)
Multiselect an und dann Strg+Linksklick, oder Strg+Leertaste auf einen Selektierten.

Schwups, schon ist der Fokusierte nicht selektiert.

Boah, sogar das -Schwupps- macht er. :thumb:


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