1

我正在与 Sitefinity 合作,我正在开发一个控制设计器 - 但是我认为我的问题不是 SiteFinity 特有的。

我有一门课,例如:

公共类 CaseStudyFeaturedItem : CaseStudySelectorControlDEsignerBase

它继承的类本身就是继承自 UserControl,如下所示:

公共类 CaseStudySelectorControlDesignerBase : System.Web.UI.UserControl {

在 CaseStudyFeaturedItem 中是否可以加载作为嵌入式资源的模板,然后访问该控件上的控件?

所以本质上,我有 usercontrol.ascx 这是一个嵌入式资源,所以有一个字符串,如:

mynamespace.myclass.usercontrol.ascx;

从 CaseStudyFeaturedItem 中,我希望能够加载该用户控件,然后修改其中的控件(即文字/标签)?

这可能吗?

谢谢艾尔

4

2 回答 2

0

是的,这是可能的,但是根据您的问题,我不完全确定您要完成什么。您可以使用LoadControl动态加载用户控件。如果您将结果转换为适当的控件类型,您将可以访问其所有属性。从那里,您可以将它添加到您想要容纳它的任何容器中。那是你想做的事情吗?

于 2010-09-30T13:21:59.137 回答
0

我们对 Sitefinity 中的每个控件都执行此操作,但使用您自己的自定义控件会有点复杂(我假设您使用的是 Sitefinity 3.7)。步骤如下:
-实现一个模板容器控件,继承自 GenericContainer

protected class ItemListContainer : GenericContainer
{
    public virtual Repeater RepeaterControl
    {
        get { return base.GetControl<Repeater>("repeater", true); }
    }
}

-您需要从资源中获取模板(使用 ControlUtils.GetTemplate 方法 - Sitefinity 为您执行此操作):

public virtual ITemplate ItemListTemplate
{
    get
    {
        if (itemListTemplate == null)
            itemListTemplate = ControlUtils.GetTemplate(<virtual path to template>, <resource file name>,
                <type to determine assembly for template>);
        return itemListTemplate;
    }
    set
    {
        itemListTemplate = value;
    }
}

-您需要调用模板的 InstantiateIn 方法,并将其传递给容器控件

listContainer = new ItemListContainer();
ItemListTemplate.InstantiateIn(listContainer);

-通过容器访问所有控件

listContainer.RepeaterControl.DataBind();

在 Sitefinity 4.0 中,我们为所有控件包含了一个基类,它将为您提供开箱即用的功能。但在 3.7 中,您必须手动完成所有这些操作。

ControlUtils 类位于 Telerik.Framework.Web 命名空间中。上面的代码是如何在 ContentView 控件中完成这一切的,您可能应该根据您的情况稍作修改。

干杯,
Slavo
Sitefinity 团队 @ Telerik

于 2010-10-01T12:20:40.773 回答