0

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

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

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

当 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 属性,而无需将任何 devexpress 单元添加到单元的使用子句中。

4

1 回答 1

0

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

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

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;
于 2013-02-08T15:45:42.190 回答