How to MultiSelect in the Delphi DBGrid

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;

猜你喜欢

转载自blog.csdn.net/aiib69/article/details/80339680
今日推荐