Friday, February 08, 2008

DBGrid with MultiSelect: Multiple row selection in Delphi DBGrid - providing the ability to select multiple records within the grid


Delphi's DBGrid is one of the mostly used DB aware component in database related applications. It's main purpose is to display and enable users of your application to manipulate records from a dataset in a tabular grid.

One of the lesser known features of the DBGrid component is that you can set it to allow multiple row selection. What this means is that the users of your application will have the ability to select multiple records (rows) from the dataset connected to grid.

Allowing multiple selections
To enable multiple selection, you only need to set the dgMultiSelect element to True in the Options property. When dgMultiSelect is True, users can select multiple rows in a grid using the following techniques:
- Ctrl + Mouse clicks
- Shift + Arrow Keys

The (rows) records selected are represented as bookmarks and are stored in the grid's SelectedRows property. Note that SelectedRows is only meaningful when the Options property includes dgMultiSelect and dgRowSelect (both are set to True). On the other hand, when using dgRowSelect (individual cells cannot be selected) the user won't be able to edit records directly through the grid - dgEditing is automatically set to False.

The SelectedRows property is an object of type TBookmarkList. We can use the SelectedRows property to, for example:
• get the number of rows selected,
• clear the selection (unselect),
• delete all the selected records,
• check whether a particular record is selected.

To set dgMultiSelect to True you can either use the Object Inspector (design time) or at the run time a command like:
DBGrid1.Options:= DBGrid1.Options + [dgMultiSelect];

When to use dgMultiSelect?
In situations when you need an option to select random records and, for example, sum a value of a specific field in all selected records. Other situations involve deletion of multiple records or similar...

An example
Following the concepts set in the Beginners Guide to Delphi Database Programming, example below uses ADO components (AdoQuery connected to ADOConnection, DBGrid connected to AdoQuery over DataSource) to display the records from a database table in a DBGrid component.
If you do not know how to display records from a database table (or query) in a DBGrid component, please explore the "Connecting to a database" chapter.
procedure TForm1.btnDoSumClick(Sender: TObject);
i: Integer;
sum : Single;
if DBGrid1.SelectedRows.Count > 0 then
sum := 0;
with DBGrid1.DataSource.DataSet do
for i := 0 to DBGrid1.SelectedRows.Count-1 do
sum:= sum + AdoQuery1.FieldByName('Size').AsFloat;
edSizeSum.Text := FloatToStr(sum);

The code above uses multiple selection to get the sum of the values in the "Size" field. The picture shows the code in action:

Delphi DBGrid with multiple selection

That's it. Simple and powerful. If you want to select the entire DBGrid from code, you can use this code snippet. To see how to add colors to DBGrid, see the Coloring DBGrid article; of course don't miss the "Using the DBGrid" article collection!

Looking for last minute shopping deals? Find them fast with Yahoo! Search.