2011-01-22 67 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部件添加到页面时,这会在功能区中添加两个上下文组/选项卡。

相关问题