【问题标题】:Get all controls of the current form at design-time在设计时获取当前表单的所有控件
【发布时间】:2011-04-23 14:47:44
【问题描述】:

我有一个关于设计时的问题:

我制作了一个带有“链接”属性的组件。 这些链接是控件。现在我想制作一个 UI-Dialog(用于在属性网格中编辑此属性)。

如何获得当前表单的所有控件?我认为组件与它有联系,但在哪里?我什么都找不到。

谢谢:)

【问题讨论】:

    标签: c# .net winforms windows-forms-designer design-time


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      这很简单,我不知道有任何 .NET 组件的例子可以做到这一点。您可以在设计时使用 Site 属性访问表单,但存在问题。难以处理的是用户删除控件,即您已经添加到控件集合中的控件。除了必须为表单或用户控件使用自定义设计器之外,我不知道有什么好的触发器可以让您的集合保持有效。

      有一个更好的捕鼠器,例如 HelpProvider 和 ErrorProvider 组件。请注意它们如何将属性添加到窗体上的所有其他控件。这是通过实现 IExtenderProvider 接口来完成的。 MSDN library article 中有一个很好的例子。

      【讨论】:

      • 嗯......是的,这很糟糕:-/我知道扩展器属性。但它们并不是我真正想做的,因为我需要分配另一个控件......嗯,也许我找到了解决方案。
      【解决方案3】:

      您可以在设计时获得IDesignerHost 服务。该服务有一个名为Container 的属性,它有Components。然后对于每个组件,获取INestedContainer 服务,然后从该服务获取所有组件。

      文档大纲窗口就是这样工作的。我已经更改了他们的方法以使用List<IComponent> 作为返回值:

      List<IComponent> GetSelectableComponents(IDesignerHost host)
      {
          var components = host.Container.Components;
          var list = new List<IComponent>();
          foreach (IComponent c in components)
              list.Add(c);
          for (var i = 0; i < list.Count; ++i)
          {
              var component1 = list[i];
              if (component1.Site != null)
              {
                  var service = (INestedContainer)component1.Site.GetService(
                      typeof(INestedContainer));
                  if (service != null && service.Components.Count > 0)
                  {
                      foreach (IComponent component2 in service.Components)
                      {
                          if (!list.Contains(component2))
                              list.Add(component2);
                      }
                  }
              }
          }
          return list;
      }
      

      要过滤结果以仅包含控件,您可以调用result.TypeOf&lt;Control&gt;()

      【讨论】:

        【解决方案4】:

        不确定这是不是你想要的。

        我“丢失”了一个标签控件,因为我不小心删除了它的 text 属性。

        看了这里的讨论后,我终于意识到,通过在设计时访问任何控件属性,我可以使用属性窗口顶部的下拉菜单来定位控件名称。选择名称会显示控件在表单上的位置,并在属性编辑器中显示它的属性。

        【讨论】:

          猜你喜欢
          • 2015-05-14
          • 2013-04-29
          • 1970-01-01
          • 2016-02-10
          • 2020-05-26
          • 1970-01-01
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多