4

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

当我们添加第二个 Web 部件时,功能区栏被隐藏,您必须单击 Web 部件才能再次显示功能区栏。单击 Web 部件不是我们可以向用户提出的要求,因此我试图让功能区栏在我们的 xslt listview Web 部件的上下文中始终可见。

在搜索此问题时,我发现当您在 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

是否可以通过服务器端代码强制功能区栏可见,或者我可以在单击 web 部件以显示功能区栏时调用正在使用的 javascript 代码?

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

4

5 回答 5

6

您可以使用 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); 
    } 
 });
于 2012-07-12T21:24:30.363 回答
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 部件

于 2013-06-12T13:44:45.940 回答
0

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

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

其中“body”可以是您想要的任何父元素,其中包含悬停时自动选择的 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();
于 2014-03-11T21:25:44.077 回答
0

一个很好的解决方案是在视图页面上获取主要 Web 部件的 contextualInfo。

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);
       }
}
于 2013-07-03T15:15:56.010 回答
0

低于使用 SharePoint 的按需脚本而不是 100 毫秒超时或 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");
于 2018-01-10T09:51:01.730 回答