Solved

How to tie a combo box entries to a value in the same row with Express Quantum Grid?

Posted on 2008-10-07
3
428 Views
Last Modified: 2010-04-21
I am working with Express Quantum Grid 6 and I want to have the following effect:

I have a table that consists of two (for this example) columns, a Type and a SubType.  The Type is a fixed list of items in a combobox and the subtype is a list of items in a combobox BUT it is based on the Type.  For example Type might be a type of car and subtype might be a color so:

Toyota, Red
Toyota, Blue
Toyota, Green
Ford, Blue
Ford, Red

In this example if you drop down the first column and pick Toyota you would get the options of Red, Blue and Green in the 2nd Subtype dropdown.  However if you picked Ford as the type, the Subtype drowndown would only show Blue and Red as options to pick.  This needs to update dynamically on each row so if I pick a row that already had Ford chosen I could only pick Blue and Red even though the last item I worked on might of had Toyota chosen.
0
Comment
Question by:lgallion
  • 2
3 Comments
 
LVL 37

Expert Comment

by:Geert Gruwez
ID: 22663117
Use the onInitEdit of the View

it would off course be easier to write a query and use the filled in fields in the where


procedure TForm1.cxGrid1TableView1InitEdit(Sender: TcxCustomGridTableView;

  AItem: TcxCustomGridTableItem; AEdit: TcxCustomEdit);

var aType, aModel, aColor: string;

begin

  aType := '';

  aModel := '';

  aColor := '';

  with Sender.DataController do

    if (RecordCount > 0) and (FocusedRecordIndex >= 0) then

    begin

      aType := VarToStr(Values[FocusedRecordIndex, colType.Index]);

      aModel := VarToStr(Values[FocusedRecordIndex, colModel.Index]);

      aColor := VarToStr(Values[FocusedRecordIndex, colColor.Index]);

    end;

  with TcxCombobox(AEdit).ActiveProperties.Items do

  begin

    if AItem = colType then

    begin

      Add('Toyota');

      Add('VW');

    end;

    if AItem = colModel then

    begin

      // Query for model of type

      if aType = 'Toyota' then

      begin

        Add('Sedan');

        Add('Cabrio');

        Add('Break');

      end else if aType = 'VW' then

      begin

        Add('Break');

        Add('Cabrio');

      end else

        Add('Please select type first');

    end;

    if AItem = colColor then

    begin

      if aType = 'Toyota' then

      begin

        if aModel = 'Sedan' then

        begin

          Add('Red');

          Add('Green');

        end else if aModel = 'Cabrio' then

        begin

          Add('Blue');

          Add('Green');

        end else if aModel = 'Break' then

        begin

          Add('Red');

        end else

          Add('No color for this type and model');

      end else if aType = 'VW' then

      begin

        if aModel = 'Sedan' then

        begin

          Add('Red');

          Add('Green');

        end else if aModel = 'Cabrio' then

        begin

          Add('Blue');

          Add('Green');

        end else if aModel = 'Break' then

        begin

          Add('Red');

        end else

          Add('No color for this type and model');

      end else

        Add('Please select type and model first');

    end;

  end;

end;

Open in new window

0
 
LVL 37

Accepted Solution

by:
Geert Gruwez earned 500 total points
ID: 22666722
don't forget to set dcoImmediatePost on the View.DataController.Options
and on the options of the Combobox columns

if you want it from a query


procedure TForm1.AddValues(aType, aModel, aColor: string; aCombo: Integer; List: TStrings);

var Qry: TQuery;

  aField: string;

begin

  List.Clear;

  case aCombo of 

    1: aField := 'CARTYPE';

    2: aField := 'MODEL';

    3: aField := 'COLOR';

  else 

    aField := '';

  end;

  if aField <> '' then 

  begin

    Qry := TQuery.Create(Self);

    try

      Qry.SQL.Text := 

        'SELECT NUMBERPLATE, CARTYPE, MODEL, COLOR FROM CARS '+

        'WHERE (CARTYPE = :CARTYPE or :CARTYPE IS NULL)      '+

        '  AND (MODEL = :MODEL OR :MODEL IS NULL)            '+

        '  AND (COLOR = :COLOR OR :COLOR IS NULL)            ';

      Qry.Prepare;

      Qry.ParamByName('CARTYPE').Value := Null;

      Qry.ParamByName('MODEL').Value := Null;

      Qry.ParamByName('COLOR').Value := Null;

      if aType <> '' then 

        Qry.ParamByName('CARTYPE').AsString := aType;

      if aModel <> '' then 

        Qry.ParamByName('MODEL').AsString := aModel;

      if aColor <> '' then 

        Qry.ParamByName('COLOR').AsString := aColor;

      Qry.Open;

      while Qry.Eof do 

      begin

        if List.IndexOf(Qry.FieldByName(aField).AsString) = -1 then 

          List.Add(Qry.FieldByName(aField).AsString);

        Qry.Next;

      end;

    finally

      Qry.Free;

    end;

  end;

end;
 

procedure TForm1.cxGrid1TableView1InitEdit(Sender: TcxCustomGridTableView;

  AItem: TcxCustomGridTableItem; AEdit: TcxCustomEdit);

var aType, aModel, aColor: string;

  aCombo: integer;

begin

  aType := '';

  aModel := '';

  aColor := '';

  with Sender.DataController do

    if (RecordCount > 0) and (FocusedRecordIndex >= 0) then

    begin

      aType := VarToStr(Values[FocusedRecordIndex, colType.Index]);

      aModel := VarToStr(Values[FocusedRecordIndex, colModel.Index]);

      aColor := VarToStr(Values[FocusedRecordIndex, colColor.Index]);

    end;

  aCombo := 0;

  if aItem = colType then 

    aCombo := 1

  else if aItem = colModel then 

    aCombo := 2

  else if aItem = colColor then 

    aCombo := 3;

  AddValues(aType, aModel, aColor, aCombo, TcxCombobox(AEdit).ActiveProperties.Items);

end;

Open in new window

0
 

Author Closing Comment

by:lgallion
ID: 31503920
Thanks for you quick and complete answer :-)
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
This article is meant to give a basic understanding of how to use R Sweave as a way to merge LaTeX and R code seamlessly into one presentable document.
This video teaches viewers about errors in exception handling.
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…

912 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

26 Experts available now in Live!

Get 1:1 Help Now