【问题标题】:What event fires every time a TDbGrid's selected location is changed?每次更改 TDbGrid 的选定位置时会触发什么事件?
【发布时间】:2010-09-22 15:00:23
【问题描述】:

我的项目中有一个 TDbGrid,我试图在每次更改所选行时触发一个事件。行中的任何更改都已更新链接到同一数据源的所有数据感知控件,但还有其他更改需要进行,我需要一个事件处理程序。

我认为 OnColEnter 会起作用。根据帮助文件,它在以下情况下触发:

  • 用户导航到单元格使用 键盘。例如,当 用户使用 Tab 键或 Home 钥匙。

  • 用户单击鼠标按钮 在牢房里。

  • SelectedField 或 SelectedIndex 属性已设置。

不幸的是,当用户在启用 dgRowSelect 选项并且没有 OnRowEnter 时使用键盘导航时,它确实不会触发。 OnKeyDown 事件在选择更改之前触发。我正在尝试在这里模拟 TListBox 的数据感知版本,并且我需要一些东西来替换列表框的 OnClick 处理程序,尽管名称实际上在任何时候更改选择时都会消失,无论是通过鼠标还是键盘。有什么办法可以用 TDbGrid 做到这一点?如果没有,则必须有其他一些网格控件可以做到这一点。有谁知道它是什么? (最好是开源的?)

【问题讨论】:

  • 您尝试过 OnScrollData 吗?它应该工作!

标签: delphi datagrid event-handling


【解决方案1】:

你试过DataSource的OnDataChange事件吗?

【讨论】:

  • 好吧,如果尼克这么说,我想我将不得不接受它。我必须做一些额外的工作,以防止每次对数据集进行任何更改时都会触发愚蠢的事情,例如当我仍在填充它时,处理程序中的代码会导致 AVs。我希望有更好的解决方案。
【解决方案2】:

OnDataChange 是一种选择。另一个是,在 TDataset 方面,事件 AfterScroll。大多数时候,我发现它比 OnDataChange 更实用;因为在 OnDataChange 中,滚动事件带有 Field 参数 nil(这是一个陷阱,可能是您的 AV 对其进行编码的原因之一)。

【讨论】:

  • 是的,我想我更喜欢那个。
  • 但是TDBGridSelCountSelectedRows 属性在OnDataChangeAfterScroll 事件上都没有改变。如何访问实际选定的行数据?
  • @Altaveron:TDbGrid 改变了关联数据源的实际行指针,所以如果你这样做Grid.Datasource.Dataset.FieldByName([name of the field]),你将从当前记录中获取数据。如果我没有记错的话,selcount 和 selectedRows 仅在您将网格配置为允许选择多行时使用。
  • @Fabricio 我想获得用户选择的多行,但在任何情况下都只能访问前一个选择。
【解决方案3】:

使用 OnDataChange 并处理加载数据集的情况,添加布尔检查作为例程的第一行,并在加载完成时将其设置为 false。

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  if fbLoading then exit;
  // rest of your code here
end;

procedure TForm1.Form1Create(Sender:tObject);
begin
  fbLoading := true;
  // load your table here     
  fbLoading := false; 
end;

【讨论】:

    【解决方案4】:

    我只会在数据集上使用 AfterScroll,当你第一次打开数据集时会触发它,每次你移动它时都会触发它。在 DBGrid 中,每次点击一行或滚动条,或使用键盘(Home、Edn、Up、Down、PgUp、PgDown)...等。

    如果您以多种不同的形式(在创建/释放或显示/关闭中)使用相同的数据集,您甚至可以动态分配它:

    procedure TForm1.myAfterScroll(DataSet: TDataSet); 
    begin
       //do your thing here
       if oldAfterScroll<>nil then
          oldAfterScroll(DataSet);
    end;
    
    constructor TForm1.Create(AOwner: TComponent);
    begin
       oldAfterScroll:=DBGrid1.DataSet.OnAfterScroll;
       DBGrid1.DataSet.OnAfterScroll:=myAdrerScroll;
    end;
    
    destructor TForm1.Free;
    begin
       DBGrid1.DataSet.OnAfterScroll:=oldAfterScroll;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 2013-07-16
      • 2023-04-05
      相关资源
      最近更新 更多