如何获取命名空间中的所有控件?

4

如何获取命名空间中的所有控件?例如,我想获取System.Windows.Forms中的控件:TextBox、ComboBox等。


可能是重复的问题,参考链接:https://dev59.com/TknSa4cB1Zd3GeqPQ8Us - Shamim Hafiz - MSFT
1
或者 https://dev59.com/T3NA5IYBdhLWcg3wdtv5 - František Žiačik
@Gunner,请仔细阅读问题,他谈论的是命名空间而不是您指定的表单容器。 - Akash Kava
@Akash:请查看历史记录 - 标题已从“在控件中”更改为“在命名空间中”,这是一个相当模糊的问题 :) - Nick
3个回答

6

命名空间中的控制这个概念有点不清楚。您可以使用反射来获取给定命名空间中从特定基类型派生的程序集中的类。例如:

class Program
{
    static void Main()
    {
        var controlType = typeof(Control);
        var controls = controlType
            .Assembly
            .GetTypes()
            .Where(t => controlType.IsAssignableFrom(t) && 
                        t.Namespace == "System.Windows.Forms"
            );
        foreach (var control in controls)
        {
            Console.WriteLine(control);
        }
    }
}

我想知道你是否需要使用“startswith”而不是相等来比较命名空间,以便包括子命名空间中的控件。 - Nick
@Nick,是的,这是可能的,具体取决于特定的要求。 - Darin Dimitrov
太棒了!有了这个,我甚至可以从我的应用程序中获取自定义命名空间中的所有控件。这正是我一直在寻找的。谢谢! - C4d

5
这将返回指定命名空间中的所有类:
string @namespace = "System.Windows.Forms";

var items = (from t in Assembly.Load("System.Windows.Forms").GetTypes()
        where t.IsClass && t.Namespace == @namespace
        && t.IsAssignableFrom(typeof(Control))
        select t).ToList();

还需要检查该类是否为控件。 - Nick
@Nick 确认一下,已经编辑过了以检查控件类型! ;) - Farzin Zaker
找不到 System.Windows.Forms。 - deneme

0
您的表单对象具有一个名为Controls的成员,它的类型为ControlCollection。它本质上是一个控件列表(在底层有一些其他接口)。
编辑:根据您的评论,您需要将控件强制转换回文本框。首先,您必须将其标识为控件。
foreach (var control in controls)
{
    if(control is TextBox)
    {
        (control as TextBox).Text = "Or whatever you need to do";
    }
}

我能否通过一个字符串值创建一个控件? - deneme
"System.Window.Forms.TextBox" 如何从该字符串值创建文本框。 - deneme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接