如何获得TabPage的在其上的用户控制数据类型驻留(How to get TabPage on w

2019-09-19 16:24发布

我建立使用用户控制wrappper方法的自定义数据类型。 在这我加入现有TinyMCE的数据类型。 问题是,我需要找到一种方式来动态获取其上的数据类型驻留,这样我可以添加TinyMCE的按钮菜单当前的TabPage的保持。 这是我目前有(在TabPage的是硬编码):

使用说明:

using umbraco.cms.businesslogic.datatype;
using umbraco.editorControls.tinyMCE3;
using umbraco.uicontrols;

OnInit方法:

private TinyMCE _tinymce = null;

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    this.ID = "crte";

    DataTypeDefinition d = DataTypeDefinition.GetDataTypeDefinition(-87);
    _tinymce = d.DataType.DataEditor as TinyMCE;
    ConditionalRTEControls.Controls.Add(_tinymce);

    TabView tabView = Page.FindControl("TabView1", true) as TabView;
    TabPage tabPage = tabView.Controls[0] as TabPage;
    tabPage.Menu.InsertSplitter();
    tabPage.Menu.NewElement("div", "umbTinymceMenu_" + _tinymce.ClientID, "tinymceMenuBar", 0);
}

用户控制:

<asp:PlaceHolder ID="ConditionalRTEControls" runat="server" />

注:Page.FindControl是使用递归查找控件的自定义扩展方法。

Answer 1:

如果有通过一把umbraco API来访问TabPage的一种方法,我很乐意,但是,这方面的工作在过去的几个小时后,我能得到的标签的唯一方法是通过遍历父控件,直到我来到了标签。

码:

private TinyMCE _tinymce = null;

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    this.ID = "crte";

    DataTypeDefinition d = DataTypeDefinition.GetDataTypeDefinition(-87);
    _tinymce = d.DataType.DataEditor as TinyMCE;
    ConditionalRTEControls.Controls.Add(_tinymce);
}

protected void Page_Load(object sender, EventArgs e)
{
    TabView tabView = Page.FindControl("TabView1", true) as TabView;
    TabPage tabPage = GetCurrentTab(ConditionalRTEControls, tabView);
    tabPage.Menu.NewElement("div", "umbTinymceMenu_" + _tinymce.ClientID, "tinymceMenuBar", 0);
}

private TabPage GetCurrentTab(Control control, TabView tabView)
{
    return control.FindAncestor(c => tabView.Controls.Cast<Control>().Any(t => t.ID == c.ID)) as TabPage;
}

扩展方法:

public static class Extensions
{
    public static Control FindControl(this Page page, string id, bool recursive)
    {
        return ((Control)page).FindControl(id, recursive);
    }

    public static Control FindControl(this Control control, string id, bool recursive)
    {
        if (recursive)
        {
            if (control.ID == id)
                return control;

            foreach (Control ctl in control.Controls)
            {
                Control found = ctl.FindControl(id, recursive);
                if (found != null)
                    return found;
            }
            return null;
        }
        else
        {
            return control.FindControl(id);
        }
    }

    public static Control FindAncestor(this Control control, Func<Control, bool> predicate)
    {
        if (predicate(control))
            return control;

        if (control.Parent != null)
            return control.Parent.FindAncestor(predicate);

        return null;
    }
}


文章来源: How to get TabPage on which a user control data type resides