none
ItemCommand de Repeater limitado? RRS feed

  • 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

    terça-feira, 17 de setembro de 2013 19:07

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

    quarta-feira, 18 de setembro de 2013 11:24
  • 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


    quarta-feira, 18 de setembro de 2013 12:29
  • 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

    quarta-feira, 18 de setembro de 2013 13:44
  • 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



    quarta-feira, 18 de setembro de 2013 14:00
  • Caro Ricardo,

    Tentei a sua sugestão mas, infelizmente, não funcionou.

    Está misterioso!

    Grato pela sua atenção.

    Paulo Ricardo Ferreira

    quarta-feira, 18 de setembro de 2013 14:58
  • Paulo Ricardo,

    Recomendo você fazer um debug do fluxo utilizando o IE e verificar onde está estourando seu TIMEOUT


    Ricardo Minoru Makiyama



    quarta-feira, 18 de setembro de 2013 15:13
  • Caro Ricardo,

    Dei uma olhada nos ajustes do IIS e o time-out da sessão está em 20 minutos!

    O fato é que nunca debuguei utilizando o IE. Alguma dica?

    Grato pela sua atenção.

    Paulo Ricardo Ferreira

    quarta-feira, 18 de setembro de 2013 16:28
  • 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



    quarta-feira, 18 de setembro de 2013 16:57
  • 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

    quarta-feira, 18 de setembro de 2013 17:24
  • 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


    quarta-feira, 18 de setembro de 2013 17:31
  • Caro Ricardo,

    Removi o UpdatePanel e não deu nenhum erro e o problema dos 6 cliques persistiu.

    Grato pela sua atenção.

    Paulo Ricardo Ferreira

    quarta-feira, 18 de setembro de 2013 17:41
  • 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

    quarta-feira, 18 de setembro de 2013 18:26