我想知道是否可以动态加载用户控件?
这是一些显示我的意思的代码:
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
是我的用户控件。
现在如何加载其他用户控件
按名称而不是硬键入类对象?
这样我可以创建更多应用程序而忘记如何加载它们。 (case "SF01":
)
所有应用程序都将驻留在项目文件夹applications
下,也许有一种方法可以遍历该项目文件夹?
答案 0 :(得分:2)
是的。
用户控件可以使用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);
答案 1 :(得分:1)
我通过反射找到了一个(更简单的)Solution。
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++;
}
}
现在一切都按预期工作了!
只需要做更多错误保护(调用失败,......)