2011-01-22 20 views
1

按照http://blog.dennus.net/2010/07/20/ribbon-buttons-with-postback-in-sp2010/所示,而不是在該示例中使用聲明性的方法的例子中,我的OnPreRender事件期間創建的自定義web部件類和註冊色帶數據擴展,pageComponent腳本等。問題的自定義web部分添加上下文功能區選項卡

一切似乎工作得很好,我得到了當顯示Web部件頁時呈現的上下文組/標籤/控件。但是,如果我在同一頁面上添加兩個我的自定義Web部件,我遇到了錯誤:ArgumentException:Item已被添加。鍵入詞典:添加「Ribbon.MyContextualTabGroup」鍵:「Ribbon.MyContextualTabGroup」]。

我該如何避免這個問題?什麼是最好的方法?理想情況下,當選擇頁面上的不同自定義Web部件時,我希望功能區上下文組/選項卡/控件呈現不同,但我錯過了該部件在SharePoint 2010功能區框架中的工作方式。

在試圖檢測到頁面上的第一個Web部件可能已經註冊了上下文組時,我嘗試了SPRibbon.IsTabAvailable(tabID),但這總是返回我的真實 - 即使在我實際添加了選項卡XML數據擴展之前。我很困惑。注意我沒有使用自定義動作/功能部署方法,而是動態註冊功能區數據擴展和頁面組件。

下面是展示我如何加入色帶代碼片段:



Microsoft.Web.CommandUI.Ribbon ribbon = SPRibbon.GetCurrent(theWebPart.Page); 
if (ribbon != null) 
{ 
    // register data extension 
    XmlDocument ribbonExtensions = new XmlDocument(); 
    ribbonExtensions.LoadXml(ContextualGroupInfo.ToXml()); 
    ribbon.RegisterDataExtension(ribbonExtensions.FirstChild, 
    "Ribbon.ContextualTabs._children"); 

    // Register initialize function 
    var manager = new SPRibbonScriptManager(); 
    var methodInfo = typeof(SPRibbonScriptManager).GetMethod(
     "RegisterInitializeFunction", 
     System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 

    methodInfo.Invoke(manager, new object[] 
     { 
     webPart.Page, 
     "InitPageComponent", 
     "/_layouts/PageComponent.js", 
     false, 
     "RibbonCustomization.PageComponent.initialize()" 
     }); 

    var commands = new List(); 
    commands.Add(new SPRibbonCommand(ContextualGroup.EnableContextualGroupCommand)); 
    commands.Add(new SPRibbonCommand(ContextualTab.EnableContextualTabCommand)); 
    ... 
    // add ribbon button commands 
    ... 

    // initialize tab 
    ribbon.Minimized = false; 
    ribbon.CommandUIVisible = true; 
    if (!ribbon.IsTabAvailable(ContextualTab.ID)) 
    { 
     ribbon.MakeTabAvailable(ContextualTab.ID); 
     ribbon.EnableVisibilityContext(ContextualTab.VisibilityContext); 
     ribbon.MakeContextualGroupInitiallyVisible(ContextualTabGroupID, string.Empty); 
     ribbon.NormalizeContextualGroup(ContextualTabGroupID, string.Empty); 
    } 

    // Make the tab active by default when the page is opened. 
    ribbon.InitialTabId = ContextualTab.ID; 
    ... 
} 
+0

你可以添加錯誤的完整堆棧跟蹤,它從 – djeeg 2011-01-22 05:35:24

+0

拋出的位置這裏是短堆棧跟蹤: [ArgumentException:Item已被添加。鍵入字典:'Ribbon.QuestContextualTabGroup' 正在添加的鍵:'Ribbon.QuestContextualTabGroup'] System.Collections.Hashtable.Insert(Object key,Object nvalue,Boolean add) Microsoft.Web.CommandUI.RibbonRenderer.RenderRibbon(。 ..) Microsoft.Web.CommandUI.Ribbon.AppendRibbon(...) Microsoft.Web.CommandUI.Ribbon.Render(HtmlTextWriter的作家)1394 Microsoft.SharePoint.WebControls.SPRibbon.Render(HtmlTextWriter的作家) 。 .. System.Web.UI.Page.Render(HtmlTextWriter作家) 它崩潰了SharePoint頁面。 – sean 2011-01-22 21:33:09

回答

0

這聽起來像你的地方添加TabGroup兩次色帶集合。始終讓您的添加代碼被檢查包圍,以查看是否已添加選項卡組。

if (!ribbon.IsTabAvailable(yourid)) { 
    ribbon.MakeTabAvailable(yourid); 
} 

這就是你添加的代碼的樣子嗎?

0

我最終生成了獨特的上下文組ID和具有自定義Web部件的數據擴展XML的序列以避免此錯誤。然而,當兩個Web部件添加到頁面時,這會在功能區中添加兩個上下文組/選項卡。

相關問題