SharePoint在页面上显示带有多个webpart的功能区

时间:2011-11-03 09:45:08

标签: sharepoint sharepoint-2010 ribbon sharepoint-clientobject

我创建了一个sharepoint页面,其中包含xslt webpart和与问题无关的第二个webpart

当我们添加第二个webpart时,功能区被隐藏,您必须单击webpart才能再次显示功能区栏。 单击webpart不是我们可以向用户询问的内容,因此我尝试使用xslt listview webpart的上下文始终显示功能区栏。

在搜索此问题时,我发现当您在SharePoint源代码中使用反射器搜索此隐藏的功能区行为时,似乎这是Microsoft设计的行为,如下例所示:

public override bool Visible { 
get {
if (!this.SingleWebPartPresentOnPage)
return false;
else
return base.Visible; 
} 
}

有同样问题但没有解决方案的人:http://www.glynblogs.com/2011/02/list-view-selector-missing-with-multiple-web-parts-in-sharepoint-2010.html

是否可以使用服务器端代码强制显示功能区栏,还是可以在单击webpart显示功能区栏时调用正在使用的javascript代码?

我认为应该可以使用javascript,因为如果单击xslt webpart,功能区可见,但我无法重现正在执行的代码。

5 个答案:

答案 0 :(得分:5)

您可以使用JavaScript重新选择XSLTListViewWebPart,再次显示功能区。

$(document).ready(function() { 
    var target = document.getElementById("MSOZoneCell_WebPartWPQ2"); 
    if(target != null) { 
        var fakeEvent = new Array();
        fakeEvent["target"] = target;
        fakeEvent["srcElement"] = target;
        WpClick(fakeEvent); 
    } 
 });

答案 1 :(得分:1)

Javascript下面为我工作!!

<script>
setTimeout(function() {
var elem = document.getElementById("MSOZoneCell_WebPartWPQ4");
if(elem != null) {
var dummyevent = new Array();
dummyevent["target"] = elem;
dummyevent["srcElement"] = elem;
WpClick(dummyevent);
}
}, 100);
</script>

在上面的脚本中,MSOZoneCell_WebPartWPQ4是我的列表视图Web部件

答案 2 :(得分:0)

一个很好的解决方案是在视图页面上获取主Web部件的上下文信息。

public class MyView : WebPart, IWebPartPageComponentProvider 
{

      protected override void CreateChildControls(){.............}
      public WebPartContextualInfo WebPartContextualInfo
      {
            get
            {
                // get default current view webart (WebPartWPQ2)
                ListViewWebPart listView = this.WebPartManager.WebParts
                     .OfType<ListViewWebPart>().FirstOrDefault();
                // use reflection to get non-public member containing contextualinfo
                var t = listView.GetType();
                WebPartContextualInfo oViewInfo = (WebPartContextualInfo)t.InvokeMember("Microsoft.SharePoint.WebControls.IWebPartPageComponentProvider.WebPartContextualInfo", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.GetProperty, null, listView, new object[] { });

                return oViewInfo;
            }
        }
        protected override void OnPreRender(EventArgs e)
        {

            SPRibbon ribbon = SPRibbon.GetCurrent(this.Page);
            // Ensure ribbon exists.
            if (ribbon != null)
            {
                // Load dependencies if not already on the page.
                ScriptLink.RegisterScriptAfterUI(this.Page, "SP.Ribbon.js", false, true);
            }
            base.OnPreRender(e);
       }
}

答案 3 :(得分:0)

与Thorstens解决方案类似,我使用jQuery在mouseenter事件上触发WpClick函数。此方法还可以解决当用户首次进入页面并尝试使用其中一个菜单时,完整工具栏会出现问题的问题。如果需要,您可以在页面上捕获任意数量Web部件的事件气泡。例如:

$("body").on("mouseenter","#MSOZoneCell_WebPartWPQ2,#MSOzoneCell_WebPartWPQ3, . . . etc.",function() {
  WpClick(event);
});

身体&#34;身体&#34;可以是您想要的任何父元素,其中包含在悬停时自动选择的Web部件。

如果只关注一个Web部件,或者为了在大页面上获得最佳性能,您还可以直接在区域上设置事件。

$("#MSOZoneCell_WebPartWPQ2").attr("onmouseenter","WpClick(event)");

或者如果jQuery不可用

var el = document.getElementById("MSOZoneCell_WebPartWPQ2"); 
if(el != null) {
  el.setAttribute('onmouseenter','WpClick(event);');
}

或者,您仍然可以强制功能区在页面加载之后以及用户通过手动触发事件而悬停之前显示。在附上上述事件后,只需包含相应的代码即可。例如使用jQuery

$("#MSOZoneCell_WebPartWPQ2").mouseenter();

答案 4 :(得分:0)

使用SharePoint的Script On Demand而不是100ms超时或jquery的版本下面。我认为这更加稳固,因为它在色带初始化后完全执行。

SP.SOD.executeOrDelayUntilScriptLoaded(function () {
    //using setTimeout to ensure it will be executed after the code of sp.ribbon.js has done its initialization
    setTimeout(function () {
        //try to focus the default webpart so the ribbon will show
        var elem = document.getElementById("MSOZoneCell_WebPartWPQ2");
        if (elem != null) {
            var dummyevent = new Array();
            dummyevent["target"] = elem;
            dummyevent["srcElement"] = elem;
            WpClick(dummyevent);
        }
    }, 0);
}, "sp.ribbon.js");