C#Winform的动态加载以名称用户控件(C# Winform dynamically load

2019-10-19 02:06发布

我想知道是否有可能以动态加载用户控件?
这是一些代码来说明我的意思:

public void Load()
        {

            Reset();

            if (_host.User == null)
                return;

            int _count = 0;

            String[] _applications = _host.User.Applications;

            if (_applications == null)
                return;

            foreach (String _application in _applications)
            {

                TabPage _page = null;

                switch (_application)
                {
                    case "SF01":

                        _page = new TabPage();
                        _page.Text = "SF01";
                        _page.Controls.Add(new SF01(_container));

                        break;
                }

                if (_page != null)
                {

                    tapplications.TabPages.Add(_page);
                    m_list.Add(_count, _page);
                    _count++;

                }

            }

            tapplications.TabPages.Add(tlog);

            if (_host.User.Admin)
                tapplications.TabPages.Add(tadmin);

            _container.Controls.Add(this);

        }

正如你所看到SF01是我的用户。
现在我该怎样去通过名称加载其他的usercontrols而不是硬打字类对象?
这样我可以创造出更多的应用程序,而忘记了如何加载它们。 ( case "SF01":

所有的应用程序都将驻留在项目文件夹下applications ,也许有办法通过项目文件夹重复?

Answer 1:

是的。

的用户控制可以使用实例化Activator.CreateInstance ,任何其它类型的对象。

string objTypeName = "myNamespace.UI.SF01"; // Full namespace name
SF01 myNewSF01 = (Foo)Activator.CreateInstance(Type.GetType(objTypeName));

然后你就可以将其替换您的switch语句

_page = new TabPage();
_page.Text = "SF01";

var control = (Control)Activator.CreateInstance(Type.GetType("myNamespace." + _application));
_page.Controls.Add(control);


Answer 2:

我发现了一个(简单的) 解决方案通过使用反射。

foreach (String _application in _applications)
            {

                TabPage _page = null;

                Type[] _atypes = new Type[] { typeof(Panel) };
                Object[] _avalues = new Object[] { _container };
                ConstructorInfo _ctor = Type.GetType("SFM." + _application).GetConstructor(_atypes);
                Object _control = _ctor.Invoke(_avalues);

                if (_control != null)
                {
                    _page = new TabPage();
                    _page.Text = _application;
                    _page.Controls.Add((Control)_control);
                }

                if (_page != null)
                {

                    tapplications.TabPages.Add(_page);
                    m_list.Add(_count, _page);
                    _count++;

                }

            }

现在一切都按预期工作!
只是需要做更多的错误保护(调用失败,...)



文章来源: C# Winform dynamically load usercontrols by name