c# - 在 Windows 窗体 C# 上查找组件(不是控件)

标签 c# winforms visual-studio-2012 controls components

我知道如何查找和收集 Windows 窗体中使用的所有控件的列表。 像这样:

static public void FillControls(Control control, List<Control> AllControls)
{
    String controlName = "";
    controlName = control.Name;

    foreach (Control c in control.Controls)
    {
        controlName = c.Name;
        if ((control.Controls.Count > 0))
        {
            AllControls.Add(c);
            FillControls(c, AllControls);
        }
    }
}

但是,此函数不会检索表单底部的非可视组件,如 HelpProvider、ImageList、TableAdapters、DataSets 等。

有没有办法也获取这些组件的列表?

编辑:

感谢@HighCore 指导我在类似的函数中使用 System.ComponentModel.Component,它确实为我提供了一个包含 ImageList、Help Provider 和 BindingSource 等组件的列表。 但是,我仍然错过了此列表中的 TableAdapter 和 DataSet。我想是因为那些直接继承自 Object。

。不要让我引用显示与我的功能相似且仅获取控件列表的旧帖子。

编辑:为什么投反对票?这个问题以前从未有人回答过!

最佳答案

令人惊讶的是,似乎唯一的方法是通过反射。

private IEnumerable<Component> EnumerateComponents()
{
    return from field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
           where typeof (Component).IsAssignableFrom(field.FieldType)
           let component = (Component) field.GetValue(this)
           where component != null
           select component;
}

关于c# - 在 Windows 窗体 C# 上查找组件(不是控件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17171914/

相关文章:

c# - 表服务上下文: Can't cast to unsupported type 'DateTimeOffset' exception when serializing

c# - 从定界字符串中提取第一个标记

c# - uwp 应用程序(.net native )和未处理的异常

c# - 停止在 WinForm 上触发 Enter 键

c# - 在 C# 中加载 XML 文件路径

c++ - Windows 应用商店应用程序的扩展 SDK 在远程调试期间不起作用

c# - 每次聚焦文本框时如何打开表单?

c# - WinForms 中单选按钮列表的第三方控件?

c# - 表单未正确加载

VB.Net Google Page Speed Api 如何将策略更改为移动设备