Force position in a TStringGrid

LeTay
LeTay used Ask the Experts™
on
After having filled in a TStringGrid programmatically, I want to force a specific row, say row N, to be "selected"
How can I achieve that
Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Top Expert 2011

Commented:
Make sure to set the following options of the StringGrid from the OI:
goRangeSelect = False
goRowSelect = True

Use OnSelectCell event to test for the current select row if it matches your target row then allow select, otherwise CanSelect equals False:
//Set the current selected row:
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Row:= N;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  CanSelect:= False;

  //list the allowed rows to be selected
  if ARow = N then
    CanSelect:= True;
end;

Open in new window

Author

Commented:
Ok
If now I use StringGrid1.Row = something somewhere in my code, does that forces the selectcell event automatically ?
Top Expert 2011

Commented:
As you can see, at OnSelectCell event there is "N", where the comparison takes place to either allow or deny selecting rows, so it all depends on what you assign to this "N".
So no, it will not be automatically, you need to assign value to the "N" variable every time you need to update the selected row(s).

If you need other solution, it would be disable the entire StringGrid after selecting the row, unless you need to do some work on it, in this case you need to restrict selection by OnSelectCell event.
CompTIA Network+

Prepare for the CompTIA Network+ exam by learning how to troubleshoot, configure, and manage both wired and wireless networks.

Author

Commented:
Well, not sure to have explained exactly what I needed.
When the form is displayed, the TStringGrid is filled in (from database data).
The "selected" row is the first one below the titles.
User click on another row, that row becomes the selected one.
At that time, the user can do some action, and after that action, I refresh completely the TStringGrid (clear and filled in again)
How can I then, at that precise time, have that previously select row (says row N), become the selected (and highlighted) one ?
Top Expert 2011
Commented:
> Well, not sure to have explained exactly what I needed.

Now it is clear.
Then all you have to do is:
N:= StringGrid1.Row;
...do update the StringGrid
StringGrid1.Row:= N;

Open in new window


But this means your StringGrid will always be matching the records count/order before updates.
For instance, when updating (doing some actions, like deleting record) the rows count is different now and when filling the StringGrid there is a possibility that you might select the wrong row.
Hence you need to have a key that you store before updating and after the update start looking for that key and select the row that is matching.

Is it possible to use DBGrid instead of StringGrid? DBGrid will offer better utilization of DB linking and Locate functionality.

Author

Commented:
Many thanks

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial