如何获取用户控件数据类型所在的TabPage

2024-01-31

我正在使用用户控件包装器方法构建自定义数据类型。我在其中添加现有的 TinyMCE 数据类型。问题是我需要找到一种方法来动态获取数据类型所在的当前 TabPage,以便我可以将 TinyMCE 按钮添加到菜单中。这就是我目前所拥有的(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" />

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


如果有一种方法可以通过 Umbraco API 访问 TabPage,我会很高兴,但是,在过去几个小时的研究之后,我获取该选项卡的唯一方法是遍历父控件,直到到达该选项卡。

Code:

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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取用户控件数据类型所在的TabPage 的相关文章

随机推荐

  • 避免“缓冲区溢出”C6386 警告

    在我的代码中 我使用数组xyz共 10 个对象 当我尝试使用 unsigned int 索引访问数组的元素时 如下所示 xyz level I get 缓冲区溢出 http msdn microsoft com en us library
  • 将所有函数折叠到 R-Studio 脚本中

    基本上我已经在一个 R 脚本中编写了相当多的函数 为了创建更好的概述并且不必滚动太多 我通常按函数定义左侧的箭头 将其折叠 对于 30 多个函数来说 这可能非常烦人 因为当我运行它们时 它们会不断 展开 我所说的折叠的意思可以在这张照片中看
  • code::blocks 是否保留除 C++ 关键字之外的名称?

    我是 code blocks 的新手 而且在 C 方面也没有经验 我知道有很多关键字 我不应该将它们用于变量名称 并且它们通常以不同的颜色显示 就像在 Visualstudio 中一样 现在 当我将一些代码片段从旧的 vs 项目复制到新的
  • Azure - 无法连接到 RDP

    我必须更改管理员密码 因为它已通过 RDP 过期 更改后服务器工作正常 后来我断开了会话 然后再次启动它 现在我们收到以下错误消息 发生身份验证错误 无法联系当地安全机构 远程计算机 cloudapp net 即使两台服务器重新启动后 同样
  • 实际安装模块时 pip install 期间出现 ModuleNotFoundError

    我尝试使用安装 python 包 BentoML pip install bentoml 我收到以下错误 该错误给出了ModuleNotFoundError No module named wrapt 但是 那wrapt模块实际上包含在我的
  • 使用 Powershell 将文件检入 TFS

    作为持续集成构建的一部分 我正在创建一个 SQL 脚本 该 SQL 脚本生成后必须重新签入 TFS 我在 Powershell 中使用 TFS Powertools 我在我的机器上使用的代码是 Add TfsPendingChange Ad
  • iOS 7 UIWebView 304 缓存错误,空白页

    我在具有 UIWebView 的应用程序中发现了一个问题 iOS 7 缓存了空白正文 304 响应 导致用户刷新 UIWebView 时显示空白页面 这不是良好的用户体验 我正在尝试找出如何在 iOS 端解决此问题 因为我无法控制 Amaz
  • unmodifierList 线程安全吗?

    我有一个字符串 tagList 列表 需要在多个线程之间共享以供读取 因此我创建了它的不可修改版本并将其传递给线程 我不确定它是否是线程安全的 因为线程只读取该列表 所以我猜应该可以吧 另外 当我将不可修改的列表传递给线程时 它是传递单个副
  • 将自纪元以来的时间戳转换为 datetime.datetime

    自纪元以来我有以下时间戳 Timestamp 1346114717972 1354087827000 如何将这些时间戳转换为某种特定的输出格式 例如mm dd yyyy hr min sec 我尝试将它们转换为datetime dateti
  • 如何为 RabbitMQ 连接设置自定义名称?

    能够通过连接名称识别 RabbitMQ 客户端将非常有用 我正在使用 Spring Cloud Streams 抽象 并且使用默认设置我得到类似的东西 如何在 Spring Boot 客户端中设置自定义 RabbitMQ 连接名称 EDIT
  • Gridview 中的 TimeSpan DataFormatString

    我有一个带有来自 linq 查询的 ObjectDataSource 的 gridview 源的变量之一是时间跨度 我将绑定字段与 DataField MyTimeSpanVariable 绑定 数据包含以秒和分钟为单位的时间 很少以小时为
  • EF5 收到此错误消息:无法检查模型兼容性,因为数据库不包含模型元数据

    每次运行该应用程序时 都会显示此错误消息 我正在使用实体Framework 5 Code First 这是错误消息 System NotSupportedException Model compatibility cannot be che
  • 分布式 Elixir 示例不起作用

    我有一个非常简单的 Elixir 代码示例 我想在不同的节点上运行 第一个节点位于我的笔记本电脑上 第二个节点是 Raspberry Pi 通过 SSH 访问 代码很简单 node1 my computer defmodule Hello
  • Visual Studio 和 SQL Server - 安装顺序正确吗?

    我正在重建我的开发机器 这个问题对我来说并不新鲜 但我不记得解决方案 我从 SQL 2008 Developer 开始 然后是 VS 2008 Pro SQL SP1 VS SP1 结果是我无法打开SSIS项目 参见下面的错误 正确的顺序是
  • 监听 Flutter 中的 API 变化

    假设我有一个 API 它提供一个返回 id 和名称的 JSON 响应 在移动应用程序中 通常我会发出一个 http GET 响应 以便在与服务器的一次性连接中获取此数据 并在应用程序中显示结果 但是 如果数据随着时间的推移而变化 并且我想在
  • 如何在asp.net中显示Page_Load函数中设置的变量值

    我有一个从数据库获取的变量 我想在 html 之间的 aspx 页面中输出该变量 我试图将其公开 但它显示一些错误 如何在其 aspx 页面中使用页面加载函数中设置的变量 第一种方式 您将 Literal 控件放置在要显示变量的位置 然后在
  • 带有选项的简单选择标签在 Chrome 上不起作用

    我遇到了这个问题 我无法在我的 chrome 上扩展这个简单的选择标签
  • 在应用程序中使用多个网络接口

    我编写了一个应用程序 通过 wifi 触发索尼 qx 智能手机可连接相机 但是 我需要通过另一个本地网络实时传输手机上的图像 由于 wifi 卡用于 qx 连接 我需要能够通过 USB 使用以太网从手机传输图像 HTTP 请求将用于触发相机
  • 当手动将进度设置为 MotionLayout 时,它会清除所有约束

    我有带有两个小部件的 MotionLayout 一个在 MotionLayout 中描述 第二个在场景文件中描述 布局文件
  • 如何获取用户控件数据类型所在的TabPage

    我正在使用用户控件包装器方法构建自定义数据类型 我在其中添加现有的 TinyMCE 数据类型 问题是我需要找到一种方法来动态获取数据类型所在的当前 TabPage 以便我可以将 TinyMCE 按钮添加到菜单中 这就是我目前所拥有的 Tab