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 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 Beginner's Guide to Delphi 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.

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;

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

That's it. Simple and powerful. If you want to select the entire DBGrid from code, you can use this code snippet.