A expansão ListViewByQuery Web Part preso no "Trabalho sobre ele..."
-
10-12-2019 - |
Pergunta
Eu estou usando um ListViewByQuery
em um custom web-parte.Se eu definir o CAML GroupBy
para <GroupBy Collapse='FALSE'>
(i.é.expandido), a peça web funciona bem.No entanto, se eu configurá-lo para <GroupBy Collapse='TRUE'>
, o item irá se expandir, mas, em seguida, é preso/trava no "Trabalho sobre ele..." mensagem:
(Eu acredito que a mensagem antiga no SharePoint 2010 foi de "Carregando...").
Aqui está a cópia de trabalho quando é pré-expandidas:
Este não parece ser um JavaScript problema (testado em vários navegadores).
Como faço para corrigir isso?
De lado:Karine menciona um problema muito semelhante em seu blog usando o ListViewByQuery
Web Part aqui.Vou testar o sugerido JavaScript correcção e relatar de volta, mas eu acredito que essa é apenas uma solução - o que é a causa e a solução?
Atualização:Eu não consigo fazer a JS correcção de trabalho.Eu estou gerar dinamicamente o ListViewByQuery
controle na minha peça web personalizada (como aparentemente necessário) e a JS, parece fogo, eu não posso determinar como depurá-lo.
Atualização 2:Finalmente tenho a JS correcção de trabalho - o colapso estava sendo chamado duas vezes (de modo que seria jsut expandir novamente).Vai sugerir isso como possível resposta em breve, mas não aceitá-lo como resposta real.
Solução
Isto é simplesmente como eu tenho o JavaScript correcção/kludge de trabalho.Em primeiro lugar, você deve pré-expanda a ListViewByQuery
CAML (grupo deCollapse='FALSE'
).Em segundo lugar, a sugestão de JavaScript é executado duas vezes e simplesmente fecha/expande o resultado, de modo que ele parece não funcionar em 2013.Então aqui está como eu tenho de trabalhar:
Eu criar o ListViewByQuery
controle dinamicamente (como requerido/recomendar no documentário):
Panel pnlDiv = new Panel();
pnlDiv.ID = "pnlDiv";
pnlDiv.CssClass = "ms-authoringcontrols";
ListViewByQuery lvPdfs = new ListViewByQuery();
..
EnsureChildControls();
pnlDiv.Controls.Add(lvPdfs);
pnlDiv.RenderControl(writer);
RenderChildren(writer);
Como tive problemas com o JavaScript eu emitida ele do lado do servidor:
private void RegisterExpandJavascriptFix()
{
ClientScriptManager cs = Page.ClientScript;
if (!cs.IsClientScriptBlockRegistered(this.GetType(), "CollapseFunc"))
{
cs.RegisterClientScriptBlock(this.GetType(), "CollapseFunc", JSExpandFix, true);
}
if (!cs.IsStartupScriptRegistered(this.GetType(), "Collapse"))
{
cs.RegisterStartupScript(this.GetType(), "CollapseFunc", "collapseDiv();", true);
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
RegisterExpandJavascriptFix();
}
}
E aqui está o JavaScript:
private const string JSExpandFix = @"function collapseDiv() {
var div = document.getElementById('pnlDiv');
//alert(div);
if (div != null) {
var links = div.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
if (links[i].href == 'javascript:' && links[i].onclick.toString().indexOf('ExpCollGroup') > -1 && links[i].previousSibling.tagName == 'IMG') {
//alert(links[i].onclick.toString());
links[i].click();
}
}
}
}";
Nota o links[i].previousSibling.tagName == 'IMG')
check - esta é apenas a minha maneira de garantir que ele só clica em primeira colapso de link (i.e.a plus/minus imagem, em vez do texto).