我创建了一个sharepoint页面,其中有一个xslt webpart和第二个与问题无关的webpart
当我们添加第二个web部件时,ribbon bar是隐藏的,您必须单击web部件才能再次显示ribbon bar。点击webpart并不是我们可以要求用户做的事情,所以我尝试让ribbon bar在任何时候都可以在我们的xslt listview webpart的上下文中显示。
当搜索这个问题时,我发现当你在SharePoint源代码中搜索这个带有反射器的隐藏色带行为时,它似乎是由微软设计的行为,如下面的例子所示:
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
是否可以强制功能区栏与服务器端代码可见,或者我可以调用javascript代码,正在使用时,我点击webpart显示功能区栏?
我认为这应该是可能的javascript,因为如果你点击xslt webpart功能区是可见的,但我不能重现正在执行的代码
您可以使用JavaScript重新选择XSLTListViewWebPart,使ribbon再次出现。
$(document).ready(function() {
var target = document.getElementById("MSOZoneCell_WebPartWPQ2");
if(target != null) {
var fakeEvent = new Array();
fakeEvent["target"] = target;
fakeEvent["srcElement"] = target;
WpClick(fakeEvent);
}
});
下面的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_webparttwpq4是我的列表视图web部件
一个很好的解决方案是在视图页面上获取主webpart的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);
}
}
下面的版本使用SharePoint的Script On Demand而不是100毫秒超时或jquery。我认为这更可靠,因为它是在ribbon初始化之后执行的。
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");
与thorsten的解决方案类似,我使用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);');
}
可选地,您仍然可以通过手动触发事件来强制Ribbon在页面加载之后和用户悬停之前出现。只需在附加上述事件后包含适当的代码。例如使用jQuery
$("#MSOZoneCell_WebPartWPQ2").mouseenter();