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…
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.