博客地址 http://blog.csdn.net/foxdave

1. First of all, let me show you the ribbon modal in our project whcih just like the example from internet.

>>SPMIPRibbon.cs

I've add some clear comments.

using System.Collections.Generic;
using System.Reflection;
using System.Web.UI;
using System.Xml;
using Microsoft.SharePoint.WebControls; namespace Common
{
public class SPMIPRibbon
{
//Ribbon definition template
private const string contextualTabTemplate = "\r\n<GroupTemplate Id=\"Ribbon.Templates.Flexible2\">" +
"\r\n<Layout Title=\"LargeLarge\">" +
"\r\n<OverflowSection Type=\"OneRow\" TemplateAlias=\"o1\" DisplayMode=\"Large\"/>" +
"\r\n<OverflowSection Type=\"OneRow\" TemplateAlias=\"o2\" DisplayMode=\"Large\"/>" +
"\r\n</Layout>" +
"\r\n<Layout Title=\"LargeMedium\">" +
"\r\n<OverflowSection Type=\"OneRow\" TemplateAlias=\"o1\" DisplayMode=\"Large\"/>" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o2\" DisplayMode=\"Medium\"/>" +
"\r\n</Layout>" +
"\r\n<Layout Title=\"LargeSmall\">" +
"\r\n<OverflowSection Type=\"OneRow\" TemplateAlias=\"o1\" DisplayMode=\"Large\"/>" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o2\" DisplayMode=\"Small\"/>" +
"\r\n</Layout>" +
"\r\n<Layout Title=\"MediumLarge\">" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o1\" DisplayMode=\"Medium\"/>" +
"\r\n<OverflowSection Type=\"OneRow\" TemplateAlias=\"o2\" DisplayMode=\"Large\"/>" +
"\r\n</Layout>" +
"\r\n<Layout Title=\"MediumMedium\">" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o1\" DisplayMode=\"Medium\"/>" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o2\" DisplayMode=\"Medium\"/>" +
"\r\n</Layout>" +
"\r\n<Layout Title=\"MediumSmall\">" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o1\" DisplayMode=\"Medium\"/>" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o2\" DisplayMode=\"Small\"/>" +
"\r\n</Layout>" +
"\r\n<Layout Title=\"SmallLarge\">" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o1\" DisplayMode=\"Small\"/>" +
"\r\n<OverflowSection Type=\"OneRow\" TemplateAlias=\"o2\" DisplayMode=\"Large\"/>" +
"\r\n</Layout>" +
"\r\n<Layout Title=\"SmallMedium\">" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o1\" DisplayMode=\"Small\"/>" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o2\" DisplayMode=\"Medium\"/>" +
"\r\n</Layout>" +
"\r\n<Layout Title=\"SmallSmall\">" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o1\" DisplayMode=\"Small\"/>" +
"\r\n<OverflowSection Type=\"ThreeRow\" TemplateAlias=\"o2\" DisplayMode=\"Small\"/>" +
"\r\n</Layout>" +
"\r\n<Layout Title=\"Popup\" LayoutTitle=\"LargeMedium\" />" +
"\r\n</GroupTemplate>"; /// <summary>
/// Add Ribbon UI Method
/// </summary>
/// <param name="page">current control</param>
/// <param name="tab">ribbon definition</param>
/// <param name="tabID">ribbon tab id</param>
/// <param name="isAvailable">is available</param>
private static void AddRibbonTab(Page page, string tab, string tabID, bool isAvailable)
{
SPRibbon current = SPRibbon.GetCurrent(page);
if (current != null)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(tab);
current.RegisterDataExtension(doc.FirstChild, "Ribbon.Tabs._children");
doc.LoadXml(contextualTabTemplate);
current.RegisterDataExtension(doc.FirstChild, "Ribbon.Templates._children");
current.Minimized = false;
current.CommandUIVisible = true;
if (!current.IsTabAvailable(tabID))
{
current.MakeTabAvailable(tabID);
}
if (isAvailable)
{
current.InitialTabId = tabID;
}
}
} /// <summary>
/// Add Ribbon Event Method
/// </summary>
/// <param name="page">current control</param>
/// <param name="cmds">event detail</param>
private static void AddTabEvents(Page page, List<IRibbonCommand> cmds)
{
SPRibbonScriptManager manager = new SPRibbonScriptManager();
typeof(SPRibbonScriptManager).GetMethod("RegisterInitializeFunction", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(manager, new object[] { page, "InitPageComponent", "/_layouts/SCRIPTS/SPMIPRibbon.js", false, "SPMIPRibbon.PageComponent.initialize()" });
manager.RegisterGetCommandsFunction(page, "getGlobalCommands", cmds);
manager.RegisterCommandEnabledFunction(page, "commandEnabled", cmds);
manager.RegisterHandleCommandFunction(page, "handleCommand", cmds);
} /// <summary>
/// Set Ribbon Method
/// </summary>
/// <param name="page">current control</param>
/// <param name="tab">ribbon definition</param>
/// <param name="tabID">ribbon tab id</param>
/// <param name="cmds">event detail</param>
/// <param name="isAvailable">is available</param>
public static void Set(Page page, string tab, string tabID, List<IRibbonCommand> cmds, bool isAvailable)
{
AddRibbonTab(page, tab, tabID, isAvailable);
AddTabEvents(page, cmds);
}
}
}

>>SPMIPRibbon.js

Ribbon command javascript file

function ULS_SP() {
if (ULS_SP.caller) {
ULS_SP.caller.ULSTeamName = "Windows SharePoint Services 4";
ULS_SP.caller.ULSFileName = "SPMIPRibbon.js";
}
} Type.registerNamespace('SPMIPRibbon'); SPMIPRibbon.PageComponent = function () {
ULS_SP();
SPMIPRibbon.PageComponent.initializeBase(this);
} SPMIPRibbon.PageComponent.initialize = function () {
ULS_SP();
ExecuteOrDelayUntilScriptLoaded(Function.createDelegate(null, SPMIPRibbon.PageComponent.initializePageComponent), 'SP.Ribbon.js');
} SPMIPRibbon.PageComponent.initializePageComponent = function () {
ULS_SP();
var ribbonPageManager = SP.Ribbon.PageManager.get_instance();
if (null !== ribbonPageManager) {
ribbonPageManager.addPageComponent(SPMIPRibbon.PageComponent.instance);
ribbonPageManager.get_focusManager().requestFocusForComponent(SPMIPRibbon.PageComponent.instance);
}
} SPMIPRibbon.PageComponent.refreshRibbonStatus = function () {
SP.Ribbon.PageManager.get_instance().get_commandDispatcher().executeCommand(Commands.CommandIds.ApplicationStateChanged, null);
} SPMIPRibbon.PageComponent.prototype = {
getFocusedCommands: function () {
ULS_SP();
return [];
},
getGlobalCommands: function () {
ULS_SP();
return getGlobalCommands();
},
isFocusable: function () {
ULS_SP();
return true;
},
receiveFocus: function () {
ULS_SP();
return true;
},
yieldFocus: function () {
ULS_SP();
return true;
},
canHandleCommand: function (commandId) {
ULS_SP();
return commandEnabled(commandId);
},
handleCommand: function (commandId, properties, sequence) {
ULS_SP();
return handleCommand(commandId, properties, sequence);
}
}
SPMIPRibbon.PageComponent.registerClass('SPMIPRibbon.PageComponent', CUI.Page.PageComponent);
SPMIPRibbon.PageComponent.instance = new SPMIPRibbon.PageComponent();
NotifyScriptLoadedAndExecuteWaitingJobs("SPMIPRibbon.js");

Now let us see how to use it

Declare a ribbon definition like this as below

private string ribbonTab = @"
<Tab Id=""SPMIPRibbon.Tab1"" Sequence=""400"" Description="""" Title=""清单采购一览"">
<Scaling Id=""SPMIPRibbon.Scaling1"">
<MaxSize Id=""SPMIPRibbon.MaxSize1"" Sequence=""10"" GroupId=""SPMIPRibbon.Group1"" Size=""LargeLarge""/>
<Scale Id=""SPMIPRibbon.Scale1"" Sequence=""20"" GroupId=""SPMIPRibbon.Group1"" Size=""Popup"" />
</Scaling>
<Groups Id=""SPMIPRibbon.Groups1"">
<Group Id=""SPMIPRibbon.Group1""
Sequence=""10""
Description=""""
Title=""操作区""
Image32by32Popup=""/_layouts/2052/images/formatmap32x32.png"" Image32by32PopupTop=""-416"" Image32by32PopupLeft=""-256""
Template=""Ribbon.Templates.Flexible2"" >
<Controls Id=""SPMIPRibbon.Controls1"">
<Button
Id=""SPMIPRibbon.Button2""
Sequence=""20""
Command=""SPMIPRibbon.Command2""
Image32by32=""/_layouts/2052/images/formatmap32x32.png"" Image32by32Top=""-128"" Image32by32Left=""-96""
LabelText=""编辑""
ToolTipTitle=""编辑采购清单""
ToolTipDescription=""编辑采购清单""
TemplateAlias=""o1""/>
<Button
Id=""SPMIPRibbon.Button4""
Sequence=""30""
Command=""SPMIPRibbon.Command4""
Image32by32=""/_layouts/2052/images/formatmap32x32.png"" Image32by32Top=""-160"" Image32by32Left=""-416""
LabelText=""确认招标""
ToolTipTitle=""确认招标采购清单""
ToolTipDescription=""确认招标采购清单""
TemplateAlias=""o1""/>
<Button
Id=""SPMIPRibbon.Button5""
Sequence=""30""
Command=""SPMIPRibbon.Command5""
Image32by32=""/_layouts/2052/images/formatmap32x32.png"" Image32by32Top=""-320"" Image32by32Left=""-224""
LabelText=""上传附件""
ToolTipTitle=""上传采购清单附件""
ToolTipDescription=""上传采购清单附件""
TemplateAlias=""o1""/>
</Controls>
</Group>
</Groups>
</Tab>";

Override OnPreRender method and add the following code

var cmds = new System.Collections.Generic.List<IRibbonCommand>();
cmds.Add(new SPRibbonCommand("SPMIPRibbon.Command2", "gdv.GetSelectedFieldValues('ID;Qing_dlx;Chuang_jzh', Edit);", "CheckEditEnabled();"));
cmds.Add(new SPRibbonCommand("SPMIPRibbon.Command5", "gdv.GetSelectedFieldValues('ID;Qing_dlx;Chuang_jzh', Upload);", "CheckEditEnabled();"));
cmds.Add(new SPRibbonCommand("SPMIPRibbon.Command4", "gdv.GetSelectedFieldValues('ID;Qing_dlx;Que_rzhb;Chuang_jzh', Confrim);", "CheckEditEnabled();"));
SPMIPRibbon.Set(Page, ribbonTab, "SPMIPRibbon.Tab1", cmds, true);

Enjoy it.

Here is one problem when we migrate it from SP14 to SP15, we may get error message as "getGlobalCommands not found".

The reason is in SharePoint 2013, the SPRibbonScriptManager class's execution is slower than the js execution, when the js object initializes, the needed commands have not generated.

To solve this, we need to do a little change to the js file.

Change the

ExecuteOrDelayUntilScriptLoaded(Function.createDelegate(null, SPMIPRibbon.PageComponent.initializePageComponent), 'SP.Ribbon.js');

to

_spBodyOnLoadFunctionNames.push("SPMIPRibbon.PageComponent.initializePageComponent");

That is all, thanks.

Custom Ribbon in SharePoint 2010 & which not wrok when migrate from 2010 to 2013的更多相关文章

  1. How to: Hide the Ribbon in SharePoint 2010

    转:http://blogs.msdn.com/b/sharepointdev/archive/2012/04/30/how-to-hide-the-ribbon-in-sharepoint-2010 ...

  2. [转]Creating a custom ribbon for Outlook 2013, 2010 and toolbar for Outlook 2007, 2003 – C# sample

    本文转自:https://www.add-in-express.com/creating-addins-blog/2013/05/21/outlook-ui-customization-ribbons ...

  3. [转]SharePoint 2010 Download as Zip File Custom Ribbon Action

    在SharePoint 2010文档库中,结合单选框,在Ribbon中提供了批量处理文档的功能,比如,批量删除.批量签出.批量签入等,但是,很遗憾,没有提供批量下载,默认的只能一个个下载,当选择多个文 ...

  4. sharepoint 2010 页面添加footer方法 custom footer for sharepoint 2010 master page

    转:http://blog.csdn.net/chenxinxian/article/details/8720893 在sharepoint 2010的页面中,我们发现,没有页尾,如果我们需要给页面添 ...

  5. Upgrade custom workflow in SharePoint

    Experience comes when you give a try or do something, I worked in to many SharePoint development pro ...

  6. how to create a custom form for sharepoint list

    在VS中创建一个applicationPage映射到Layouts文件夹下,然后代码如下: SPList lstTest = web.Lists["Shared Documents" ...

  7. Visual Studio 2010 集成 SP1 补丁 制作 Visual Studio 2010 Service Pack 1 完整版安装光盘的方法

    Now that Visual Studio 2010 SP1 has been released, administrators and developers may wish to install ...

  8. Systemc在VC++2010安装方法及如何在VC++2010运行Noxim模拟器

    Systemc在VC++2010的安装方法可以参考文档"Systemc with Microsoft Visual Studio 2008.pdf".本文档可以在"htt ...

  9. Installshield 2010 中集成. Net framework4 与 vc++ 2010运行安装包

    1.prq的地址,通过以下地址,下载相应的prq文件 VC 2010 redist X86: http://saturn.installshield.com/is/prerequisites/micr ...

随机推荐

  1. SQL调优学习之——sqlserver分页从低效到高效

    背景 首先感谢网友@aixuexi 在评论中的提醒,原博文介绍的几种都不是最高效,现已修改加入另一种更高效的方法. 以前都是使用mysql和oracle,对sqlserver的使用不多.最近因项目原因 ...

  2. PAT 1060 Are They Equal[难][科学记数法]

    1060 Are They Equal(25 分) If a machine can save only 3 significant digits, the float numbers 12300 a ...

  3. Jitamin

    安装环境要求 PHP 5.6或更高(推荐使用PHP7) 数据库, 推荐使用MySQL 或 PostgreSQL. 当然SQLite也可以运行. Composer 安装手册 一. 克隆代码 假设我们把j ...

  4. php生成二维码的几种方式

    一些php生成二维码的方式:1.google开放api:2.php类库PHP QR Code:3.libqrencode:4.QRcode Perl CGI & PHP scripts 1.g ...

  5. linux rsync安装与使用

    rsync Usage: /etc/init.d/rsync {start|stop|reload|force-reload|restart|status} rsync默认配置文件 # default ...

  6. redhat 5 samba配置

    1.检查安装包 #rpm –qa | grep samba 必须有以下安装结果 samba-3.0.25:samba-common-3.0.25:samba-client-3.0.25:samba-s ...

  7. mono安装

    linux上的DotNET,安装mono 当前,在Linux系统上架设ASP.NET网站.建设WEB应用工程项目已经在国内流行起来,而“Mono+Jexus”架构模式是Linux承载ASP.NET企业 ...

  8. Smarty模板变量调节器

    Smarty模板变量调节器用法 在smarty里面,怎么修饰文本和变量呢?当然,你可以通过php函数处理文本,然后再通过assign()方法分配到模板,其实smarty提供了变量调节器能够很容易的处理 ...

  9. Common Knowledge

    2014-08-23 11:01:11 -6:四面体 (1)内切球半径:r = 3V / (S1+S2+S3+S4) (2)体积:将四点组成三个向量AB,AC,AD,向量的混合积就是它们组成的平行六面 ...

  10. nginx自动生成缩略图

    网站上常常一张图片,多个地方需要使用不同的尺寸,一般的方案是上传的时候,根据不同的尺寸用程序生成多张图片. 这么做有两个缺点: 1.如果需要新的尺寸图片的话,只能遍历下数据库,重新生成一次图片. 2. ...