2012-07-18 2 views
3

Я создаю пользовательский тип данных, используя метод управления пользовательским контролем. В нем я добавляю существующий тип данных TinyMCE. Проблема в том, что мне нужно найти способ динамически удержать текущую TabPage, на которой находится тип данных, чтобы я мог добавить кнопки 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" /> 

Не e: Page. FindControl использует собственный метод расширения, который рекурсивно находит элемент управления.

ответ

1

Мне нравится, если бы был доступ к TabPage через API Umbraco, но после работы над ним в течение последних нескольких часов единственным способом получить вкладку было перемещение родительских элементов управления до тех пор, пока я пришел на вкладку.

Код:

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; 
    } 
} 
Смежные вопросы