Inquiridor
ItemCommand de Repeater limitado?

Pergunta
-
Salve!
Aplicação web para uma intranet em VB2010 Express.
Na página Default.aspx tenho um Repeater. No ItemTemplate tenho um ImageButton com um CommandName que serve para abrir a página de detalhes do respectivo registro do Repeater em outra janela (ou aba) do browser - IE9. O Repeater está dentro de um UpdatePanel.
<asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <table> <tr> <td> <asp:ImageButton ID="imgDetalhe" runat="server" ImageUrl="~/Imagens/icone_lupa.png" CommandName="VerDetalhe" CommandArgument='<%#Eval("acompanhamentoID") %>' /> </td> <td> <asp:Label ID="Label1" runat="server" Text='<%#Eval("dtInclusao") %>'/> </td> <td> <asp:Label ID="Label2" runat="server" Text='<%#Eval("assunto.assunto") %>'/> </td> <td> <asp:Label ID="Label5" runat="server" Text='<%#Eval("posicao") %>'/> </td> </tr> </table> </ItemTemplate> </asp:Repeater>
O evento ItemCommand está sendo tratado conforme código abaixo:
Private Sub Repeater1_ItemCommand(source As Object, e As System.Web.UI.WebControls.RepeaterCommandEventArgs) Handles Repeater1.ItemCommand If e.CommandName = "VerDetalhe" Then Dim jscript As String jscript = "javascript:window.open(" & "'Acompanhamentos/frmAcompanhamento.aspx?id=" & e.CommandArgument & "', '_blank');" ScriptManager.RegisterStartupScript(Me, Me.GetType(), "Cliente", jscript, True) End If End Sub
O que está acontecendo é que após fazer 6 cliques (seja no mesmo registro, ou em registros diferentes) o ItemCommand do Repeater não responde mais. Não dá nenhuma mensagem de erro, nada. Simplesmente não responde. E isso só acontece com o IE9. Com o Firefox roda normalmente.
Alguém tem alguma ideia do que pode ser isso e como contornar a situação?
Grato pela atenção de todos.
Paulo Ricardo Ferreira
Todas as Respostas
-
Salve!
Fiz uma tentativa de resolver alterando o SourceCode e o CodeBehind conforme o que segue:
<asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <table> <tr> <td> <asp:ImageButton ID="imgDetalhe" runat="server" ImageUrl="~/Imagens/icone_lupa.png" ToolTip=" Clique para detalhes do Informe de Acompanhamento " OnClientClick='target="_blank"'/> </td> <td> <asp:Label ID="Label1" runat="server" Text='<%#Eval("dtInclusao") %>'/> </td> <td> <asp:Label ID="Label2" runat="server" Text='<%#Eval("assunto.assunto") %>'/> </td> <td> <asp:Label ID="Label5" runat="server" Text='<%#Eval("posicao") %>'/> </td> </tr> </table> </ItemTemplate> </asp:Repeater>
'Private Sub Repeater1_ItemCommand(source As Object, e As System.Web.UI.WebControls.RepeaterCommandEventArgs) Handles Repeater1.ItemCommand ' If e.CommandName = "VerDetalhe" Then ' Dim jscript As String ' jscript = "javascript:window.open(" & "'Acompanhamentos/frmAcompanhamento.aspx?id=" & e.CommandArgument & "', '_blank');" ' ScriptManager.RegisterClientScriptBlock(Me, Me.GetType(), "Cliente", jscript, True) ' End If 'End Sub Private Sub Repeater1_ItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles Repeater1.ItemDataBound If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then CType(e.Item.FindControl("imgDetalhe"), ImageButton).PostBackUrl = "Acompanhamentos/frmAcompanhamento.aspx?id=" & CType(e.Item.DataItem, Acompanhamento.DTO.Acompanhamento).acompanhamentoID End If End Sub
A diferença foi que agora a aplicação, no 7º clique, "tenta" abrir a página definida na propriedade PostBackUrl, mas não abre.
A página frmAcompanhamento.aspx tem o seguinte código para o seu evento Load:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then lstDestinatarios = New List(Of String) lstInteressados = New List(Of Controle_de_Acesso.DTO.clsUsuario) Session("formAnterior") = "Acompanhamentos/frmAcompanhamento.aspx" oUser = New Controle_de_Acesso.DTO.clsUsuario oUser = CType(Session("oUser"), Controle_de_Acesso.DTO.clsUsuario) lbFecharJanela.Attributes.Add("onclick", "window.close();") If IsNothing(oUser) Then Session("usuarioCadastrado") = 0 End If Try ItemTemplate(Request.QueryString("id")) Catch ex As Exception MostraMensagem("Ocorreu o problema abaixo ao tentar mostrar o Informe de Acompanhamento:\n\n" & ex.Message) End Try End If End Sub
Coloquei um breakpoint na 1ª linha do evento (If Not PostBack) e, quando do 7º clique lá no ImageButton, não chega nem no breakpoint.
Estou realmente impressionado com o acontecido.
Grato pela atenção de todos.
Paulo Ricardo Ferreira
-
Paulo Ricardo,
Tente desta forma, testei e funciona no IE 9
Função javascript:
function fnAbrePop(strUrl, strW, x, y) {
var lado = (screen.width - x) / 2;
var topo = ((screen.height - 40) - y) / 2;
var w = window.open(strUrl, strW, "menubar=no, toolbar=no, status=no, location=no, resizable=no, scrollbars=yes, dependent=yes,width=" + x + ",height=" + y + ",top=" + topo + ",left=" + lado);
try {
w.focus();
}
catch (e) { }
}Chamada no code behind:
ScriptManager.RegisterStartupScript(Me, GetType(), "xxx", "fnAbrePop('Comprovante/PagamentoComprovante.aspx','PagamentoComprovante', '800', '600');", true);
Ricardo Minoru Makiyama
- Editado Ricardo Minoru Makiyama quarta-feira, 18 de setembro de 2013 12:32
-
Caro Ricardo,
Grato pela sua atenção, mas, desculpe, não vi diferença significativa entre o que você sugeriu e o que eu estou fazendo.
Conforme meu primeiro post, o CodeBehind está assim:
Private Sub Repeater1_ItemCommand(source As Object, e As System.Web.UI.WebControls.RepeaterCommandEventArgs) Handles Repeater1.ItemCommand If e.CommandName = "VerDetalhe" Then Dim jscript As String jscript = "javascript:window.open(" & "'Acompanhamentos/frmAcompanhamento.aspx?id=" & e.CommandArgument & "', '_blank');" ScriptManager.RegisterStartupScript(Me, Me.GetType(), "Cliente", jscript, True) End If End Sub
A única diferença é que você abre a janela com alguns parâmetros definidos, tais como: dimensões definidas, sem mostrar toolbar, menubar, etc.
Não consigo perceber como isso pode estar interferindo no fato de estar permitindo somente 6 cliques na página.
Pois é, percebi agora que não são somente os cliques no ImageButton do Repeater que ficam bloqueados após 6 cliques. Se clicar em outros controles da página que também causem postback (como os DropDownLists), nada é executado e nenhuma mensagem de erro é dada. A única coisa que acontece é, se eu não fechar a página, dar erro de timeout.
Seguem os códigos completos (SourceCode e CodeBehind):
<%@ Page Title=".: Grandes Serviços - Acompanhamentos :." Language="vb" AutoEventWireup="false" MasterPageFile="~/Site1.Master" CodeBehind="Default.aspx.vb" Inherits="Grandes_Servicos._Default" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptGlobalization="true" EnableScriptLocalization="true" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <Triggers> <asp:PostBackTrigger ControlID="ddlAnoMes" /> <asp:PostBackTrigger ControlID="ddlAssunto" /> </Triggers> <ContentTemplate> <div class="header"> <div class="title"> <h1>Lista dos Informes de Acompanhamento de Grandes Serviços - GRN.O</h1> </div> </div> <div id="divLista" runat="server" style="border: 1px solid #496077;"> <table class="listagem"> <tr class="cabecalhoColunasTabela"> <td style="width: 30px; background-color: transparent;"></td> <td style="width: 70px;">Data <asp:DropDownList ID="ddlAnoMes" runat="server" AppendDataBoundItems="true" AutoPostBack="true" Width="100%" Font-Size="9pt" /> </td> <td style="width: 250px;">Assunto<br /> <asp:DropDownList ID="ddlAssunto" runat="server" AppendDataBoundItems="true" AutoPostBack="true" Width="100%"/> </td> <td style="width: 610px;">Informe</td> </tr> </table> <asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <table> <tr style="font-size: 80%;"> <td style="text-align: left; width: 30px; vertical-align: top;"> <asp:ImageButton ID="imgDetalhe" runat="server" ImageUrl="~/Imagens/icone_lupa.png" ToolTip=" Clique para detalhes do Informe de Acompanhamento " CommandName="VerDetalhe" CommandArgument='<%#Eval("acompanhamentoID") %>'/> </td> <td style="vertical-align: top; text-align: left; width: 70px;"> <asp:Label ID="Label1" runat="server" Text='<%#Eval("dtInclusao") %>'/> </td> <td style="vertical-align: top; text-align: left; width: 250px;"> <asp:Label ID="Label2" runat="server" Text='<%#Eval("assunto.assunto") %>'/> </td> <td style="vertical-align: top; text-align: left; width: 610px;"> <asp:Label ID="Label5" runat="server" Text='<%#Eval("posicao") %>'/> </td> </tr> </table> </ItemTemplate> </asp:Repeater> </div> </ContentTemplate> </asp:UpdatePanel> </asp:Content>
Imports System.Collections.Generic Public Class _Default Inherits System.Web.UI.Page Dim lst As List(Of Acompanhamento.DTO.Acompanhamento) Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then MontaAnoMes() MontaAssunto() lst = New Acompanhamento.BLL.BLLAcompanhamento().Listar() Repeater1.DataSource = lst Repeater1.DataBind() End If End Sub Private Sub Repeater1_ItemCommand(source As Object, e As System.Web.UI.WebControls.RepeaterCommandEventArgs) Handles Repeater1.ItemCommand If e.CommandName = "VerDetalhe" Then Dim jscript As String jscript = "javascript:window.open(" & "'Acompanhamentos/frmAcompanhamento.aspx?id=" & e.CommandArgument & "', '_blank');" ScriptManager.RegisterStartupScript(Me, Me.GetType(), "Cliente", jscript, True) End If End Sub Private Sub ddlAssunto_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ddlAssunto.SelectedIndexChanged MontaAnoMes(ddlAssunto.SelectedValue) lst = New Acompanhamento.BLL.BLLAcompanhamento().Listar(ddlAssunto.SelectedValue, ddlAnoMes.SelectedValue) Repeater1.DataSource = lst Repeater1.DataBind() End Sub Private Sub ddlAnoMes_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ddlAnoMes.SelectedIndexChanged MontaAssunto(ddlAnoMes.SelectedValue) lst = New Acompanhamento.BLL.BLLAcompanhamento().Listar(ddlAssunto.SelectedValue, ddlAnoMes.SelectedValue) Repeater1.DataSource = lst Repeater1.DataBind() End Sub Private Sub MontaAnoMes(Optional ByVal _assuntoID As String = "0") Dim lstAnoMes As List(Of String) = New Acompanhamento.BLL.BLLAcompanhamento().ListarAnoMes(_assuntoID) ddlAnoMes.Items.Clear() ddlAnoMes.Items.Add(New ListItem("Todas", "0")) For Each li As String In lstAnoMes ddlAnoMes.Items.Add(New ListItem(li.ToString, li.ToString)) Next End Sub Private Sub MontaAssunto(Optional ByVal _anoMes As String = "0") Dim lstAssuntos As List(Of Assunto.DTO.Assunto) = New Assunto.BLL.BLLAssunto().Listar(_anoMes) ddlAssunto.Items.Clear() ddlAssunto.Items.Add(New ListItem("Todos", "0")) For Each li As Assunto.DTO.Assunto In lstAssuntos ddlAssunto.Items.Add(New ListItem(li.assunto, li.assuntoID)) Next End Sub End Class
E o que me intriga ainda mais é o fato de isso só acontecer com o IE9 e no Firefox rodar normalmente.
Grato pela atenção de todos
-
Paulo Ricardo,
Tente colocar somente seu Repeater dentro do UpdatePanel e nas triggers utilize:
<asp:AsyncPostBackTrigger ControlID="ddlAnoMes" EventName="SelectedIndexChanged" />
<asp:AsyncPostBackTrigger ControlID="ddlAssunto" EventName="SelectedIndexChanged" />
Ricardo Minoru Makiyama
-
-
-
-
Paulo Ricardo,
O tempo da sessão por padrão é 20 minutos mesmo.
Para debugar seu código basta você inserir um breakpoint no seu evento Load da página e ir acompanhando passo a passo (F10 e F11 para entrar nos métodos).
Ricardo Minoru Makiyama
-
Caro Ricardo,
Ok, mas como insiro um breakpoint no evento load da página no debugger do IE?
Pois, como mencionado em post anterior, colocando um breakpoint no código (VS) e debugando (F5) após abrir por 6 vezes a página de detalhe (frmAcompanhamento.aspx) não consigo fazer mais nada na página Default.aspx.
Grato pela sua atenção.
Paulo Ricardo Ferreira
-
Paulo Ricardo,
Faça um teste, remova seu UpdatePanel e verifique se algum erro é exibido.
<%@ Page Title=".: Grandes Serviços - Acompanhamentos :." Language="vb" AutoEventWireup="false" MasterPageFile="~/Site1.Master" CodeBehind="Default.aspx.vb" Inherits="Grandes_Servicos._Default" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptGlobalization="true" EnableScriptLocalization="true" /> <div class="header"> <div class="title"> <h1>Lista dos Informes de Acompanhamento de Grandes Serviços - GRN.O</h1> </div> </div> <div id="divLista" runat="server" style="border: 1px solid #496077;"> <table class="listagem"> <tr class="cabecalhoColunasTabela"> <td style="width: 30px; background-color: transparent;"></td> <td style="width: 70px;">Data <asp:DropDownList ID="ddlAnoMes" runat="server" AppendDataBoundItems="true" AutoPostBack="true" Width="100%" Font-Size="9pt" /> </td> <td style="width: 250px;">Assunto<br /> <asp:DropDownList ID="ddlAssunto" runat="server" AppendDataBoundItems="true" AutoPostBack="true" Width="100%"/> </td> <td style="width: 610px;">Informe</td> </tr> </table> <asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <table> <tr style="font-size: 80%;"> <td style="text-align: left; width: 30px; vertical-align: top;"> <asp:ImageButton ID="imgDetalhe" runat="server" ImageUrl="~/Imagens/icone_lupa.png" ToolTip=" Clique para detalhes do Informe de Acompanhamento " CommandName="VerDetalhe" CommandArgument='<%#Eval("acompanhamentoID") %>'/> </td> <td style="vertical-align: top; text-align: left; width: 70px;"> <asp:Label ID="Label1" runat="server" Text='<%#Eval("dtInclusao") %>'/> </td> <td style="vertical-align: top; text-align: left; width: 250px;"> <asp:Label ID="Label2" runat="server" Text='<%#Eval("assunto.assunto") %>'/> </td> <td style="vertical-align: top; text-align: left; width: 610px;"> <asp:Label ID="Label5" runat="server" Text='<%#Eval("posicao") %>'/> </td> </tr> </table> </ItemTemplate> </asp:Repeater> </div> </asp:Content>
Ricardo Minoru Makiyama
- Editado Ricardo Minoru Makiyama quarta-feira, 18 de setembro de 2013 17:32
-
-
Salve!
O que fiz agora foi mudar a forma de abrir a outra página. Não estou mais abrindo-a em outra janela (aba) do browser. Dessa forma o problema do limite de 6 cliques não acontece.
O problema é que essa não é a melhor opção, visto que a página Default.aspx permite a aplicação de alguns filtros à lista (Repeater). Daí que ao abrir a página de detalhe e voltar à página Default.aspx, esta já não estará com o mesmo filtro aplicado, o que incomoda o usuário.
Continua sendo um comportamento muito estranho.
Grato pela atenção de todos.
Paulo Ricardo Ferreira