有人知道我如何在共享/静态函数内部动态加载控件吗?该函数本身在mustinherit / abstract类中。 (这是VB中的ASP.NET项目)我想做这样的事情:
VB:
Public Shared Function GetWidget(ByVal name As WidgetName) As Control
Select Case name
Case WidgetName.Name1
Return LoadControl("~/Control1.ascx")
Case WidgetName.Name2
Return LoadControl("~/Control2.ascx")
Case WidgetName.Name3
Return LoadControl("~/Control3.ascx")
End Select
End Function
我的C#有点生锈,因此可能存在一些语法错误:
Public Static Control GetWidget(WidgetName name)
{
switch (name)
{
Case WidgetName.Name1:
return LoadControl("~/Control1.ascx");
break;
Case WidgetName.Name2:
return LoadControl("~/Control2.ascx");
break;
Case WidgetName.Name3:
return LoadControl("~/Control3.ascx");
break;
}
}
(其中WidgetName是枚举数。)
我收到“如果没有该类的显式实例,则无法从共享方法或共享成员初始化程序中引用该类的实例成员。”但我不理解此错误。我理解它的意思,我只是不明白为什么编译器未将调用LoadControl视为类的显式实例。使用LoadControl从文件创建新控件有什么不明显的地方?我尝试创建一个新的用户控件并对其进行初始化,然后将其设置为另一个控件,而LoadControl无效。我也不想执行DirectCast,因为我试图将其放入共享的mustinheret(抽象)类中,因此该类没有.aspx文件要写入
<%@ Reference Control="~/SomeControlPath.ascx" %>
中,因此该类名不可用。我想做的是编写一个静态函数,该函数需要一些值并仅基于该控件的源文件位置返回一个控件。最终结果是用户可修改的控件列表。他们会得到一列控件,它们可以根据我指定的可用子控件的静态列表自由添加,删除或重新排序。我不喜欢这种方法。在很多方面,它可能真的是错误的。
是的,我知道其中存在静态字符串,但实际上没有代码味道;为了提出问题,这是一种简化。
欢迎使用C#,VB或简单的英语说明。
最佳答案
是因为无法从类中返回LoadControl吗?你能试试看吗...
Protected Static string GetWidget(WidgetName name)
{
switch (name)
{
Case WidgetName.Name1:
return "~/Control1.ascx";
break;
Case WidgetName.Name2:
return "~/Control2.ascx";
break;
Case WidgetName.Name3:
return"~/Control3.ascx";
break;
}
}
并像这样调用方法
... = LoadControl(GetWidget(name));
我怀疑另一种选择是投放控制
Control c;
...
Case ...
c = (ControlName)LoadControl("~/Control1/.ascx");
break;
...
return c;
但是,调用代码仍然需要将其强制转换回其类型...