How to MultiSelect in the Delphi DBGrid

Illustrative image of hand picking up businessman representing cost cutting and recruitment
Fanatic Studio/Getty Images

Delphi's DBGrid is one of the most widely used DB-aware components in database related applications. Its main purpose is to enable your application's users to manipulate records from a dataset in a tabular grid.

One of the lesser known features of the DBGrid component is that it can be set to allow multiple row selection. What this means is that your users can have the ability to select multiple records (rows) from the dataset connected to the 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 click
  • Shift + Arrow keys

The selected rows/records are represented as bookmarks and stored in the grid's SelectedRows property.

Note that SelectedRows is only useful when the Options property is set to "True" for both dgMultiSelect and dgRowSelect. On the other hand, when using dgRowSelect (when individual cells cannot be selected) the user won't be able to edit records directly through the grid and, and 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 at design time or use a command like this at runtime:

DBGrid1.Options:= DBGrid1.Options + [dgMultiSelect];

dgMultiSelect Example

A good situation in which to use dgMultiSelect might be when you need an option to select random records or if you need the sum of the values of the selected fields.

 

The example below uses ADO components (AdoQuery connected to ADOConnection and DBGrid connected to AdoQuery over DataSource) to display the records from a database table in a DBGrid component.

The code uses multiple selection to get the sum of the values in the "Size" field. Use this sample code if you want to select the entire DBGrid:

procedure TForm1.btnDoSumClick(Sender: TObject);
var
 i: Integer;
 sum : Single;
begin
 if DBGrid1.SelectedRows.Count > 0 then
 begin
 sum := 0;
 with DBGrid1.DataSource.DataSet do
 begin
 for i := 0 to DBGrid1.SelectedRows.Count-1 do
 begin
 GotoBookmark(Pointer(DBGrid1.SelectedRows.Items[i]));
 sum:= sum + AdoQuery1.FieldByName('Size').AsFloat;
 end;
 end;
 edSizeSum.Text := FloatToStr(sum);
 end
end;