none
Repetición de ejecución de métodos en página de Silverligth RRS feed

  • Pregunta

  • Buenas Tardes.

    Desarrollo en Vb.Net 2008, MSF 3.5, Silverlight 3.0, SQL Server 2008. Telerik Silverlight Q3 2009

    He creado varias aplicaciones en Silverlight, cargando los datos por medio de Webservices, pero me surge una inquietud a la cual no le encuentro una respuesta adecuada. Las páginas funcionan correctamente pero si a X método le agrego un Mesaje de Pantalla (messagebox.show("***")), me doy cuenta que este se ejecuta al menos dos veces y si sigo usando la página se ejecuta más veces sin haber hecho el llamado. Dichos métodos en ocasiones están asociados a eventos de algún control de la página independiente del que sea.
    Hay alguna propiedad o manejo especial de Silverlight para evitar esto?

    Adjunto el código típico de una de ellas.

    Imports System
    Imports System.Collections
    Imports System.Collections.Generic
    Imports System.Windows.Threading
    Imports System.ServiceModel
    Imports System.Linq.Enumerable
    Imports System.Windows.Controls
    Imports System.Windows.Browser
    Imports System.IO
    Imports System.Xml
    Imports System.Text
    Imports Telerik.Windows.Data
    Imports Telerik.Windows.Controls
    
    Partial Public Class svlConsultaReporteFacturasRed
      Inherits UserControl
      Dim o As String = "(svlConsultaReporteFacturasRed.xaml."
    
      Dim wsQryFacInvCli As New wsSvlFactInvCliRef.wsSvlFactInventarioCliSoapClient
      Dim wsUserCon As New wsSvlUserControlRef.wsSvlUserControlSoapClient
      Dim localURI, localURI_US As Uri
      Dim punto As String
      Dim codTercero, numpro As Int64
      Dim numEjecucion As Integer = 1
    
    
      Public Sub New()
        Dim m, d As String, p As Integer
        m = "New)-" : d = "Entra" : p = 0
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
          p = 10 : InitializeComponent()
          punto = 7
          p = 10 : localURI = New Uri(Application.Current.Host.Source, "../svlProgramasWS/ConsultasReportesRed/wsSvlFactInventarioCli.asmx")
          p = 20 : Dim endpoint As New EndpointAddress(localURI)
          p = 30 : wsQryFacInvCli.Endpoint.Address = endpoint
          p = 40 : localURI_US = New Uri(Application.Current.Host.Source, "../svlProgramasWS/wsSvlUserControl.asmx")
          p = 50 : Dim endPoint_US As New EndpointAddress(localURI_US)
          p = 60 : wsUserCon.Endpoint.Address = endPoint_US
          'p = 110 : AddHandler Loaded, AddressOf svlConsultaReporteFacturasRed_Loaded
          'p = 120 : InicializarControles(paraProceso, paraSubPro)
        Catch ex As Exception
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        'p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
      Private Sub svlConsultaReporteFacturasRed_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
        Dim m, d As String, p As Integer
        m = "svlConsultaReporteFacturasRed_Loaded)-" : d = "Entra" : p = 0
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
          p = 50 : AddHandler wsQryFacInvCli.CargarDatosDetalleFacturaCompleted, AddressOf AsignarOrigenDatosGrillaCab
    
        Catch ex As Exception
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        'p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
    #Region "Métodos de los combos"
      Private Sub CargarComboFacturas()
        Dim m, d As String, p As Integer
        m = "CargarComboFacturas)-" : d = "Entra" : p = 0
        Try
          p = 40 : AddHandler wsQryFacInvCli.CargarDatosNumFacturaTerceroCompleted, AddressOf AsignarOrigenDatosComboFacturas
          p = 50 : wsQryFacInvCli.CargarDatosNumFacturaTerceroAsync(punto, codTercero)
        Catch ex As Exception
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        ' p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
      Private Sub AsignarOrigenDatosComboFacturas(ByVal sender As Object, ByVal e As wsSvlFactInvCliRef.CargarDatosNumFacturaTerceroCompletedEventArgs)
        Dim m, d As String, p As Integer
        m = "AsignarOrigenDatosComboFacturas)-" : d = "Entra" : p = 0
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
          p = 10
          If Not IsNothing(e.Result) Then
            If e.Result.Length > 0 Then
              p = 100 : rcbNumFactura.ItemsSource = e.Result
              p = 110 : rcbNumFactura.IsDropDownOpen = True
            Else
              p = 200 : rcbNumFactura.ItemsSource = ""
              p = 210 : rcbNumFactura.IsDropDownOpen = False
            End If
          Else
            MessageBox.Show("El tercero seleccionado no tiene facturas", "", MessageBoxButton.OK)
          End If
        Catch ex As Exception
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        ' p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
      Private Sub rcbNumFactura_SelectionChanged(ByVal sender As Object, ByVal e As Telerik.Windows.Controls.SelectionChangedEventArgs) Handles rcbNumFactura.SelectionChanged
        Dim m, d As String, p As Integer
        m = "rcbNumFactura_SelectionChanged)-" : d = "Entra" : p = 0
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
          p = 10 : codTercero = TryCast(usControlTerceros.rcbTercero.SelectedItem, Object).codpersona
          p = 20 : numpro = TryCast(rcbNumFactura.SelectedItem, Object).numpro
        Catch ex As Exception
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        ' p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
      Private Sub btBuscarFacturasClick(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles ibBuscarFacturas.MouseLeftButtonDown
        Dim m, d As String, p As Integer
        m = "btBuscarFacturasClick)-" : d = "Entra" : p = 0
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
    
          codTercero = TryCast(usControlTerceros.rcbTercero.SelectedItem, Object).codpersona
          If codTercero > 0 Then
            CargarComboFacturas()
          End If
        Catch ex As Exception
    
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        ' p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
      Private Sub btBuscarClick(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles ibBuscar.MouseLeftButtonDown
        Dim m, d As String, p As Integer
        m = "btBuscarClick)-" : d = "Entra" : p = 0
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
          p = 10 : codTercero = TryCast(usControlTerceros.rcbTercero.SelectedItem, Object).codpersona
          If rcbNumFactura.SelectedIndex >= 0 Then
            p = 20 : numpro = TryCast(rcbNumFactura.SelectedItem, Object).numpro
            p = 30 : CargarDatosGrillaCab()
          End If
        Catch ex As Exception
    
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        ' p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
    #End Region
    
    #Region "MétodosGrilla"
      Private Sub PaginadorGrillaCab(ByVal coleccionDatos As Object)
        Dim m, d As String, p As Integer
        m = "PaginadorGrillaCab)-" : d = "Entra" : p = 0
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
          Dim qcview As New QueryableCollectionView(coleccionDatos)
          qcview.PageSize = 200
          dpgvFacturaItems.Source = qcview
          gvFacturaItems.ItemsSource = qcview
        Catch ex As Exception
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        ' p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
      Private Sub CargarDatosGrillaCab()
        Dim m, d As String, p As Integer
        m = "CargarDatosGrillaCab)-" : d = "Entra" : p = 0
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
          gvFacturaItems.ItemsSource = ""
          lbCargandogvFacturaItems.Visibility = Windows.Visibility.Visible
          p = 50 : wsQryFacInvCli.CargarDatosDetalleFacturaAsync(punto, codTercero, numpro)
        Catch ex As Exception
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        ' p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
      Private Sub AsignarOrigenDatosGrillaCab(ByVal sender As Object, ByVal e As wsSvlFactInvCliRef.CargarDatosDetalleFacturaCompletedEventArgs)
        Dim m, d As String, p As Integer
        m = "AsignarOrigenDatosGrillaCab)-" : d = "Entra" : p = 0
    
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
          p = 10
          If Not IsNothing(e.Result) Then
            If e.Result.Length > 0 Then
              p = 100 : PaginadorGrillaCab(e.Result)
              p = 120 : gvFacturaItems.SelectedItems.Add(gvFacturaItems.Items(0))
            End If
            lbCargandogvFacturaItems.Visibility = Windows.Visibility.Collapsed
          Else
            gvFacturaItems.ItemsSource = ""
            lbCargandogvFacturaItems.Visibility = Windows.Visibility.Collapsed
          End If
        Catch ex As Exception
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        ' p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
      Private Sub gvFacturaItems_SelectionChanged(ByVal sender As Object, ByVal e As Telerik.Windows.Controls.SelectionChangeEventArgs) Handles gvFacturaItems.SelectionChanged
        Dim m, d As String, p As Integer
        m = "gvFacturaItems_SelectionChanged)-" : d = "Entra" : p = 0
    
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
    
        Catch ex As Exception
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        'p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
      Private Sub gvFacturaItems_Exporting(ByVal sender As Object, ByVal e As Telerik.Windows.Controls.GridViewExportEventArgs) Handles gvFacturaItems.Exporting
        Dim m, d As String, p As Integer
        m = "gvFacturaItems_Exporting)-" : d = "Entra" : p = 0
    
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
    
          If (e.Element = ExportElement.HeaderRow) Then
            e.Height = 30
            e.FontSize = 10
            e.FontFamily = New FontFamily("Verdana")
          ElseIf (e.Element = ExportElement.Row) Then
            e.Height = 25
            e.FontSize = 9
            e.FontFamily = New FontFamily("Verdana")
          End If
        Catch ex As Exception
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        'p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
      Private Sub btExportarExcelClick(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles ibExportarExcel.MouseLeftButtonDown
        Dim m, d As String, p As Integer
        m = "btExportarExcelClick)-" : d = "Entra" : p = 0
        Dim extension, contenido As String
        Try
          'MessageBox.Show(o & vbCrLf & m & p & d, "", MessageBoxButton.OK)
          extension = "xls"
          contenido = ""
          If numEjecucion = 1 Then
            p = 20 : Dim guardarArchivo As New SaveFileDialog()
            p = 30 : guardarArchivo.Filter = "Excel files (*." & extension & ")|*." & extension & "|All files (*.*)|*.*"
            p = 40 : guardarArchivo.DefaultExt = extension
            p = 50 : guardarArchivo.FilterIndex = 1
    
            If (guardarArchivo.ShowDialog() = True) Then
              Using arcEx As Stream = guardarArchivo.OpenFile()
                p = 60 : contenido = gvFacturaItems.ToHtml
    
                p = 70 : Dim bytes() As Byte = Encoding.UTF8.GetBytes(contenido)
                p = 80 : arcEx.Write(bytes, 0, bytes.Length)
    
                arcEx.Close()
              End Using
            End If
            numEjecucion = 2
          Else
            numEjecucion = 1
          End If
        Catch ex As Exception
          MessageBox.Show("Revisar: " & o & vbCrLf & m & p & vbCrLf & ex.Message)
        End Try
        d = ") Sale "
        ' p = 999 : MessageBox.Show(o & vbCrLf & m & p & d)
      End Sub
    
    #End Region
    
    End Class
    Por ejemplo el último método btExportarExcelClick, cuando hago el clic sobre el botón, este lo ejecuta dos veces mostrándome dos veces la venta de dialogo para guardar el archivo .


    CORDIALMENTE

    Juan Pablo Díaz
    Bogotá Colombia.

    Juan Pablo Díaz Analista de Sistemas y Desarrollo Vb.Net, MSF 3.5 y SVL 3 Bogotá - Colombia
    martes, 16 de febrero de 2010 17:30

Respuestas

  • Hola de nuevo Juan Pablo.

    Creo haber encontrado el problema que tienes.

    Yo no suelo programar en VB a no ser que sea "obligado", por eso no me habia dado cuenta.

    Veo 2 problemas en el codigo y puedes hacer uso de uno o los 2 pasos que te comento:



    1.- e.Handled no te sirve por que haces uso del evento:

    ByVal e As System.Windows.RoutedEventArgs

    que es un manejador de eventos standard para eventos enrutados, de modo que este no dispone de la propiedad Handled.
    en su lugar, puedes hacer uso del evento especifico relacionado con los botones del Mouse en el que se debe cambiar por:

    ByVal e As System.Windows.Input.MouseButtonEventArgs

    Este si que es especifico para botones del raton, de modo que dispondras de la propiedad Handled, mediante la cual se soluciona el problema.


    2.- El evento salta 2 veces debido a que especificas el evento 2 veces, esto es debido a que la palabra reservada "Handles ibBuscar.MouseLeftButtomDown" asigna el evento al control ibBuscar y seguramente en el codigo XAML le vuelves a asignar el evento mediante "MouseLeftButtonDown".

    Por lo tanto solucionaras el problema o bien quitando "Handles ibBuscar.MouseLeftButtomDown" o "MouseLeftButtonDown" en el codigo XAML.


    En cualquier caso el paso 2 lo deberias de realizar, aunque uses un evento generico, el cambiar el evento generico por uno propio del raton ya depende de si lo necesitas o no.

    Ya me contaras como te ha ido.






    Saludos
    David González
    • Marcado como respuesta Juan Pablo Díaz miércoles, 17 de febrero de 2010 20:53
    miércoles, 17 de febrero de 2010 15:46

Todas las respuestas

  • Hola Juan Pablo.

    Uff, realmente habria que comprobar muchas cosas para ver por que tiene este comportamiento, asi que vamos a ir paso a paso.

    En un principio tu puedes especificar que un evento esta manejado mediante la propiedad Handled:

    e.Handled = true; hace que ese evento no vuelva a ser procesado (ojo, esto es en el arbol de llamadas) con lo que si vuelve a ser procesado, es por que alguien ha vuelto a procesar el evento.

    Bien, esto ultimo se puede comprobar obteniendo el sender, para ver quien es el culpable de llamar a ese evento.

    sender.GetType()

    mediante esto obtendremos el nombre del objeto que ha echo la llamada a este evento, si es el mismo en los 2 casos, ya sabemos que alguien esta realizando otro click, con lo que deberias de mirar la pila para seguir el rastro hasta que veas quien es el culpable.

    asi pues, comprueba esto y me dices algo a ver si podemos llegar al problema

    Saludos
    David González
    miércoles, 17 de febrero de 2010 11:27
  • Buenos Días David.

    Gracias por tu respuesta.

    Hice las verificaciones del caso siguiendo tus opiniones.
    El caso sucede en el evento del mouseleftbuttomdown de un image a la cual le agrego este evento.

    Private Sub btBuscarClick(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles ibBuscar.MouseLeftButtomDown

    Uno el sender.GetType me retorna el mismo mensaje System.Windows.Control.Image.
    el e.Handled = true me saca error indicando que Handled no es un miembro de los argumentos.

    Curiosamente si el a la línea de la definición del método le cambia el Handles a KeyUp no ejecuta repetidamente este evento:

    Private Sub btBuscarClick(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles ibBuscar.Keyup

    por tanto no comprendo el porque.

    Algo similar me está pasando cuando uso el KeyDown y lostfocus en una caja de texto.

    Cordialmente,


    Juan Pablo Díaz.

    Juan Pablo Díaz Analista de Sistemas y Desarrollo Vb.Net, MSF 3.5 y SVL 3 Bogotá - Colombia
    miércoles, 17 de febrero de 2010 14:05
  • Hola de nuevo Juan Pablo.

    Creo haber encontrado el problema que tienes.

    Yo no suelo programar en VB a no ser que sea "obligado", por eso no me habia dado cuenta.

    Veo 2 problemas en el codigo y puedes hacer uso de uno o los 2 pasos que te comento:



    1.- e.Handled no te sirve por que haces uso del evento:

    ByVal e As System.Windows.RoutedEventArgs

    que es un manejador de eventos standard para eventos enrutados, de modo que este no dispone de la propiedad Handled.
    en su lugar, puedes hacer uso del evento especifico relacionado con los botones del Mouse en el que se debe cambiar por:

    ByVal e As System.Windows.Input.MouseButtonEventArgs

    Este si que es especifico para botones del raton, de modo que dispondras de la propiedad Handled, mediante la cual se soluciona el problema.


    2.- El evento salta 2 veces debido a que especificas el evento 2 veces, esto es debido a que la palabra reservada "Handles ibBuscar.MouseLeftButtomDown" asigna el evento al control ibBuscar y seguramente en el codigo XAML le vuelves a asignar el evento mediante "MouseLeftButtonDown".

    Por lo tanto solucionaras el problema o bien quitando "Handles ibBuscar.MouseLeftButtomDown" o "MouseLeftButtonDown" en el codigo XAML.


    En cualquier caso el paso 2 lo deberias de realizar, aunque uses un evento generico, el cambiar el evento generico por uno propio del raton ya depende de si lo necesitas o no.

    Ya me contaras como te ha ido.






    Saludos
    David González
    • Marcado como respuesta Juan Pablo Díaz miércoles, 17 de febrero de 2010 20:53
    miércoles, 17 de febrero de 2010 15:46
  • Buenas tardes David...


    Mil y mil gracias... Tenías razón aun estoy pagando la primiparada de  programar en SVL. Efectivamente estaba definiendo dicho en evento con el Hanled en Vb como el evento en el XAML.

    Quité el evento en el XAML y Cambié los los argumentos a S.W.I.MouseEvents...

    Quisiera tener oportunidad de conocer más sobre el manejo de los diferentes EventArg, donde podría leer sobre este tema?



    Juan Pablo Díaz
    Bogotá Colombia
    Juan Pablo Díaz Analista de Sistemas y Desarrollo Vb.Net, MSF 3.5 y SVL 3 Bogotá - Colombia
    miércoles, 17 de febrero de 2010 20:53
  • Hola Juan.

    En un principio, en la MSDN tienes mucha informacion sobre los eventos, uso y creacion. Le puedes echar un vistazo en:


    Centrate en el apartado "En esta seccion" y todo lo referente a eventos enrutados (como el evento que hemos tratado aqui).

    Hay bastante informacion y un evento realmente es una funcion Callback de toda la vida en Win32 pero con algunas funcionalidades extra y funcionando sobre codigo manejado, asi que puede ser un poco lioso para personas que no hayan trabajado con callbacks y hay que tener un poco de paciencia.

    Y bueno, siempre se pueden preguntar las dudas en el foro.



    Saludos
    David González
    jueves, 18 de febrero de 2010 8:05