有人知道如何在共享/静态函数中动态加载控件吗?该函数本身位于一个必须继承/抽象类中。(这是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,因为我试图把它放在一个共享的、必须继承的(抽象)类中,因此它没有.aspx文件可以写入<%@ Reference Control="~/SomeControlPath.ascx" %>,所以类名不可用。
我想要做的是编写一个静态函数,该函数接受一些值,并仅根据控件的源文件位置返回一个控件。最终结果是一个用户可修改的控件列表。它们得到一列控件,它们可以根据我指定的可用子控件的静态列表自由地添加、删除或重新排序。我并不喜欢这种方法;它可能在很多方面都是错误的。
是的,我知道那里的静态字符串有代码的味道,它看起来并不是那样的;这是为了提问而简化的。
欢迎使用C#、VB或简单的英语进行解释。
发布于 2011-07-25 05:45:07
实际上,你可以这样做(它是有效的):
UserControl tmp0 = new UserControl();
Control ctl = tmp0.LoadControl("MyControl.ascx");发布于 2009-12-31 01:32:40
LoadControl是TemplateControl类的实例方法,Page类从该类继承而来,而您的static方法中没有Page类的实例(没有this对象,因为它是静态方法)。
发布于 2010-11-09 23:02:56
这里所有的信息都很好,但令我惊讶的是,没有人使用它来实现对原始问题的实际解决方案:
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上的一种方法。就像最初的帖子一样,我很困惑为什么我会得到同样的错误。我不明白为什么在共享方法中加载一个控件是不可以的,事实上,如果你知道如何在这个上下文中调用LoadControl就可以了!
布赖恩
https://stackoverflow.com/questions/1981293
复制相似问题