【问题标题】:Set DevExpress Grid Tableview Editable property and determine its parent via RTTI设置 DevExpress Grid Tableview Editable 属性并通过 RTTI 确定其父级
【发布时间】:2013-02-08 14:13:37
【问题描述】:

我有一个带有多个 TcxGrids 的项目。我项目中网格的类层次结构如下:

TForm->TPanel->TcxPageControl->TcxTabSheet(子类)->TcxGrid->TcxGridLevel->TcxGridDBBandedTableView

在我的子类 TcxTabSheet 中,我添加了一个新属性“ReadOnly”,当 set 循环遍历选项卡表控件并将它们分别设置为启用/禁用时。

当 TcxGrid 控件启用属性设置为 true 时,用户根本无法再与网格交互(包括导航)。

看来我需要在 TcxGridDBBandedTableView 上设置 OptionsData.Editing 属性以实现只读但仍可导航的网格控件。

足够简单,直到您考虑到我想以松散耦合的方式执行此操作,我认为这让我可以选择 RTTI。

我编写了以下循环遍历表单控件的代码(循环遍历选项卡控件或组件不会让我访问 TcxGridDBBandedTableView)。找到控件后,我可以通过 RTTI 设置其编辑属性。我只是似乎无法确定 TcxGridDBBandedTableView 是否属于它所在的 TabSheet。

var
  compIdx: Integer;
begin
  for compIdx := 0 to Pred(ComponentCount) do
    if (Components[compIdx].ClassNameIs('TcxGridDBBandedTableView')) then
      SetOrdProp(GetObjectProp(Components[compIdx], 'OptionsData'), 'Editing', Ord(not FReadOnly));
end;

TL;DR 如何确定 cxgrid 所在的 pagectrl 选项卡并设置其 TableView.OptionsData.Editable 属性而不向单元的 uses 子句添加任何 devexpress 单元。

【问题讨论】:

  • 获得 cxGrid 所需的 porperty Control 似乎无法通过 RTTI 访问。
  • 如何为您的 Readonly 属性添加一个事件,该事件可用于使用 cxGrid 迭代包含的 cxgrids/views 的项目模板中。

标签: delphi devexpress


【解决方案1】:

您正在迭代表单拥有的组件。我认为这是错误的做法。您应该查看父/子关系而不是所有权。尤其是因为表单完全有可能包含它不拥有的控件。因此,您的方法可能无法找到控件,尤其是动态创建的控件。

所以,如果你有一个标签页(或者任何窗口控件),你可以像这样遍历它的子元素:

for i := 0 to TabSheet.ControlCount-1 do
  DoSomething(TabSheet.Controls[i]);

如果您的目标网格控件是选项卡表的直接后代,那么这就足够了。如果它在层次结构中不止一层,那么您将需要一个递归解决方案。我将把这个递归解决方案留给你练习。

假设您有一个控件并且想要找到它所在的选项卡表,那么您需要沿着父链向上走。像这样:

function GetParentOfClass(Control: TControl; AClass: TWinControlClass): TWinControl;
var
  Control: TWinControl;
begin
  while Assigned(Control) and not (Control is AClass) do
    Control := Control.Parent;
  Result := TWinControl(Control);
end;

【讨论】:

  • 非常感谢您花时间写下来,但遗憾的是这无助于解决我的问题,因为 TcxGridDBBandedTableView 不是从 TWinControl 继承的,因此没有父属性,但我可以从 Delphi 2007 Structure 查看器中看到,该视图确实是 TcxGrid 控件的父级 - 我只是希望我能找出它是如何解决的。
  • 你必须弄清楚如何回到网格控件。那么我的答案就是你所需要的。
  • 您的评论本质上是我的问题的 TL;DR。这是我很想知道的答案,因为在 TcxGridDBBandedTableView 中没有任何已发布的属性暗示了该出身。
  • @Paul:FWIW,您可以通过 Site.Container 从 View 到 Grid - 请参阅 here
  • 好的,看来这个谜题完成了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多