更新:我发现修改原始答案以可靠地满足你的要求在表单首次显示时显示选择计数比我预期的要棘手。
以下是测试项目的基本内容,我希望它可以可靠地按照您的要求运行。除了DBGrid之外,该表单还有一个TEdit,我使用它来确保不会最初聚焦于dbgrid(以便更容易观察dbgrid的行为),以及三个TButton,其功能应从其OnClick处理程序中自明。
您将注意到,捕获dbgrid选择计数的更改的代码仅在dbgrid的OnDrawColumnCell事件中触发。但是,在每次触发时频繁调用此事件(在我的情况下,在表单首次显示之前超过700次)会在GUI中执行其他操作。因此,该表单具有一个变量,用于跟踪选择计数,并且仅在计数更改时更新其显示(在SetSelectedCount setter中)。
type
TForm1 = class(TForm)
[...]
private
FSelectedCount: Integer;
procedure SetSelectedCount(const Value: Integer);
public
procedure ShowSelectedCount;
property SelectedCount : Integer read FSelectedCount write SetSelectedCount;
end;
[...]
procedure TForm1.btnClearSelectedClick(Sender: TObject);
begin
DBGrid1.SelectedRows.Clear;
end;
procedure TForm1.btnGetSelectedClick(Sender: TObject);
begin
ShowSelectedCount;
end;
procedure TForm1.btnSetSelectedClick(Sender: TObject);
begin
DBGrid1.SelectedRows.CurrentRowSelected := True;
end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
SelectedCount := DBGrid1.SelectedRows.Count;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ActiveControl := Edit1;
SelectedCount := -1;
end;
procedure TForm1.SetSelectedCount(const Value: Integer);
begin
if FSelectedCount <> Value then begin
FSelectedCount := Value;
ShowSelectedCount;
end;
end;
procedure TForm1.ShowSelectedCount;
begin
Caption := IntToStr(DBGrid1.SelectedRows.Count);
end;
以下是原始回答:
我通常使用 DataSet.AfterScroll
来执行一些非 GUI 的操作,这些操作需要与当前行同步。不幸的是,它不能很好地与 DBGrid 一起使用,正如你已经发现的那样,主要是因为在不滚动数据集的情况下,网格中当前行的选择状态可能会被更改(例如,通过单击它)。
不幸的是,
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
Caption := IntToStr(DBGrid1.SelectedRows.Count);
end;
这种方法并不能完全胜任任务,因为很明显,你可以通过使用键盘来扩展当前行的选择,比如使用Shift + Down。
然而,如果你只是加上
procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
Caption := IntToStr(DBGrid1.SelectedRows.Count);
end;
这个功能利用了键盘来改变选择项,并且到目前为止,它一直抵御了我的攻击。如果你允许用户在网格中进行就地编辑,你可能需要过滤用于更新选择计数的 Key
值。
顺便说一下,考虑到键盘问题以及 AfterScroll 的问题,我认为你的问题并不应该受到负评,所以我给了它一个 +1。
OnClick()
事件吗?这通常是大多数控件的正常事件。在某些控件中,它也会在实际上不是点击的情况下触发,例如使用上/下键滚动组合框。另外,我认为你应该将问题的标题更改为Data Grid
或TDBGrid
,因为我在阅读你的问题时大部分时间都以为你在谈论TStringGrid
,然后不得不重新阅读并理解为TDBGrid
。 - Jerry Dodge