将控件从文件夹添加到 tabControl

Posted

技术标签:

【中文标题】将控件从文件夹添加到 tabControl【英文标题】:Add controls from Folder to tabControl 【发布时间】:2015-01-30 09:38:45 【问题描述】:

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

我有一个 winforms 项目,在项目中我有一个名为“Controls”的文件夹,其中包含 3 个控件。

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

每个用户控件(*.cs 文件)都有一个公共字符串,其中设置了名称以及所需的 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 中?

谢谢。

【问题讨论】:

你能截图你的表格吗?因为要知道文件夹控件和3个控件和tabcontrols的设计.. 你的问题和this一样吗? 【参考方案1】:

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

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))

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

【讨论】:

对不起,我不太明白我应该在文件路径中放什么?我可以看到它要求提供程序集文件,但不太确定如何指定它的完整路径?另外,作为程序集文件的帮助如何不包含有关控件或项目中任何其他文件的任何信息:( @ArtursKirsis filepath 是包含您的控件的程序集文件的路径。即:“MyProgram\MyPluginFolder\MyTextControl.dll” 哦,好吧,这不是一个实际的 DLL。我的应用程序只是一个 EXE 文件,没有别的。所以我的项目中有一个名为“Controls”的文件夹,里面有 UserControls(*.cs 文件),所以我需要以某种方式读取这些文件并动态加载到表单中 啊,那么我的答案并不适用。如果您编辑您的问题,我将编辑答案,如何通过在启动时使用标签界面和自我反射轻松做到这一点。至少如果我现在理解正确的话 已编辑,不太确定现在是否有意义,但我可以解释的差不多了 :( 感谢您的帮助。

以上是关于将控件从文件夹添加到 tabControl的主要内容,如果未能解决你的问题,请参考以下文章

如何在windows窗体里面添加窗口

VS2012 - 将WPF现有用户控件添加到项目中

以编程方式将控件添加到 WPF 表单

如何将此 WPF 控件添加到我的 WinForm 中?

将控件添加到表格内的innerhtml div

将 ResourceDictionary 添加到类库