首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态/共享函数中的LoadControl

静态/共享函数中的LoadControl
EN

Stack Overflow用户
提问于 2009-12-31 01:17:22
回答 3查看 4.6K关注 0票数 5

有人知道如何在共享/静态函数中动态加载控件吗?该函数本身位于一个必须继承/抽象类中。(这是VB中的一个ASP.NET项目)我想这样做:

VB:

代码语言:javascript
复制
    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#有点生疏了,所以这可能有一些语法错误:

代码语言:javascript
复制
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或简单的英语进行解释。

EN

回答 3

Stack Overflow用户

发布于 2011-07-25 05:45:07

实际上,你可以这样做(它是有效的):

代码语言:javascript
复制
UserControl tmp0 = new UserControl();
Control ctl = tmp0.LoadControl("MyControl.ascx");
票数 11
EN

Stack Overflow用户

发布于 2009-12-31 01:32:40

LoadControlTemplateControl类的实例方法,Page类从该类继承而来,而您的static方法中没有Page类的实例(没有this对象,因为它是静态方法)。

票数 1
EN

Stack Overflow用户

发布于 2010-11-09 23:02:56

这里所有的信息都很好,但令我惊讶的是,没有人使用它来实现对原始问题的实际解决方案:

代码语言:javascript
复制
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就可以了!

布赖恩

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1981293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档