自定义Web部件添加上下文功能区选项卡的问题

时间:2011-01-22 05:11:02

标签: sharepoint ribbon

按照http://blog.dennus.net/2010/07/20/ribbon-buttons-with-postback-in-sp2010/中所示的示例,而不是在此示例中使用声明性方法,我在OnPreRender事件期间创建了自定义Web部件类和注册的功能区数据扩展,pageComponent脚本等。

一切似乎都运行得很好,我在显示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;
   ...
}

2 个答案:

答案 0 :(得分:0)

听起来你正在向某个地方的Ribbon系列添加两次TabGroup。请务必使用支票包围您的添加代码,以查看是否已添加标签组。

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

这是你的添加代码的样子吗?

答案 1 :(得分:0)

我最终使用自定义Web部件生成具有数据扩展XML的唯一上下文组ID和序列,以避免此错误。但是,当两个Web部件添加到页面时,这会向功能区添加两个上下文组/选项卡。