将控件从 Folder 添加到 tabControl

Add controls from Folder to tabControl

希望能帮到我。 几天来我一直在为此苦苦挣扎:(

我有一个 winforms 项目,在该项目中我有一个名为 "Controls" 的文件夹,其中有 3 个控件。

现在,我想做的是在启动时读取该文件夹,并根据该文件夹中有多少用户控件(*.cs 文件)将它们作为单独的选项卡添加到 Form1 上的 tabControl。

每个 UserControl(*.cs 文件)都有一个 public 字符串,其中设置了名称以及所需的 ID。

我可以在启动时使用这个脚本手动添加它们:

            if (((TabControl)sender).SelectedTab.Name == "ReportPupilArchiveTab")
        {
            ((TabControl)sender).SelectedTab.Controls.Add(new Controls.PupilArchiveUpdateControl());
        }
        else if (((TabControl)sender).SelectedTab.Name == "UsercodeMismatchTab")
        {
            ((TabControl)sender).SelectedTab.Controls.Add(new Controls.UserCodeMismatchControl());
        }
        else if (((TabControl)sender).SelectedTab.Name == "DataRestoreTab")
        {
            ((TabControl)sender).SelectedTab.Controls.Add(new Controls.TableRestoreControl());
        }

那么有没有一种方法可以扫描特定文件夹中的控件,然后将它们添加到 Form1 tabControl 中?

谢谢。

如果它们位于一个项目文件夹(默认为新的命名空间)中,则可以使用所需的命名空间通过反射在启动期间动态实例化特定控件。假设他们有一个标准的构造函数,这是可行的:

foreach (var controlType in System.Reflection.Assembly.GetExecutingAssembly().GetTypes().Where(t => t.Namespace == "MyProject.MyControlNamespace")) {
    var constructor = controlType.GetConstructor(Type.EmptyTypes);
    if(constructor != null) {
        var control = constructor.Invoke(null);
        //add control to your tabControl here
    }                
}

注意通过类型反映和使用 Linq 非常慢,但由于它只在启动期间完成一次,所以应该不是问题。

不使用命名空间的替代方法是创建标记接口(空接口)并让您的控件实现该接口。

interface MyControlTagInterface
{}

class CustomControl : MyControlTagInterface
{
    ...
}   

然后为每个反射类型编辑 where 子句:

.Where(t => typeof(MyControlTagInterface).IsAssignableFrom(t))

如果您不想将控件限制在一个命名空间或一个程序集中,这可能是一个优势