LoadControl在静态/共享功能
-
22-09-2019 - |
题
谁知道如何可以动态加载共享/静态功能的控制内?函数本身是为MustInherit /抽象类的内部。 (这是在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(抽象)类,因此没有在<%@ Reference Control="~/SomeControlPath.ascx" %>
.aspx文件中写的,所以类名是不可用
我试图做的是写一个静态函数,需要一些价值和回报仅基于该控件的源文件位置的控制。最终的结果是控件的用户可修改的列表。他们得到基于我指定可用的子控件的静态列表上的控制,他们自由添加,删除或重新排序的列。我没有结婚这种方法;它可能在很多方面真的错了。
是的,我知道的静态字符串是有代码的气味,它实际上并不像她那样;它是问这个问题的目的简化。
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;
击> <击>但是调用代码仍然需要将它转换回它的类型? 击>
其他提示
其实,你可以做这样的(它的工作原理):
UserControl tmp0 = new UserControl();
Control ctl = tmp0.LoadControl("MyControl.ascx");
LoadControl
是在TemplateControl
类的实例方法从Page
类继承的,你没有你的Page
方法里面的static
类的一个实例(没有this
对象,因为它是一个静态方法)。
在这里所有的好资料,但我很惊讶,没有人用它来跃升到一个实际的解决原来的问题:
Public Shared Function GetWidget(ByVal name As WidgetName,
ByVal onTemplate As TemplateControl) As Control
Select Case name
Case WidgetName.Name1
Return onTemplate.LoadControl("~/Control1.ascx")
Case WidgetName.Name2
Return onTemplate.LoadControl("~/Control2.ascx")
Case WidgetName.Name3
Return onTemplate.LoadControl("~/Control3.ascx")
End Select
End Function
我测试该溶液中,它炒菜锅。
我喜欢它比Rippo的溶液更好,因为它阻止了呼叫者从具有关于LoadControl细节担心。这无疑是一个较好的解决方案,如果有更多的工作要做,以比简单地返回它的其他所得的控制。
我也不会达到无CSharpAtl的回答这个解决方案,不过,因为我(愚蠢)没有意识到LoadControl是TemplateControl的方法。像原来的海报,我感到很困惑,为什么我得到了同样的错误。我不明白为什么它不会是确定在一个共享的方法来加载控制,而事实上,这是OK,如果你知道如何调用LoadControl在这种情况下!
布赖恩