none
Asignar valor a textbox desde una función llamada desde un Thread RRS feed

  • Pregunta

  • Buenas tardes, estoy intentando setear el valor obtenido en un filedialog a un textbox, el filedialog lo abro desde una función llamada desde un thread. Al ejecutar la el codigo no arroja ningún error pero no setea el valor en el textbox, a continuación dejo el codigo implementado y como tengo declarado el textbox, podrán ayudarme?

    Gracias de antemano!

    <asp:TextBox ID="Txt_Adjunto" runat="server" Font-Names="Bahnschrift" Font-Size="Small" Height="16px" Width="291px"></asp:TextBox>

    Esta es la función:

    Public Sub FnOpenFileDialog()
    Dim openfile As New System.Windows.Forms.OpenFileDialog
    openfile.Filter = String.Format("Image file (*.jpg)|*.jpg")
    openfile.Multiselect = False
    If openfile.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
    Txt_Adjunto.Text = openfile.FileName.ToString
    End If

    End Sub

    Este es el llamado:


    Protected Sub LnkBtn_Adjuntos_Click(sender As Object, e As EventArgs) Handles LnkBtn_Adjuntos.Click
    Dim objThread As New Thread(AddressOf FnOpenFileDialog)
    objThread.IsBackground = False
    objThread.SetApartmentState(ApartmentState.STA)
    objThread.Start()
    End Sub

    jueves, 29 de octubre de 2020 19:45

Respuestas

  • Olvídalo. No se puede hacer lo que estás haciendo. Estás llamando al OpenFileDialod de Windows Forms, pero a la vista de cómo has declarado el TextBox, se trata de una aplicación Web. Esto puede funcionar en tiempo de desarrollo cuando lo ejecutas desde Visual Studio, porque todo está rodando sobre tu escritorio. Pero en el momento en que pongas la aplicación en producción, cuando un usuario navegue a la misma se intentará abrir el OpenFileDialog en el sitio donde se está ejecutando el código, es decir, en el servidor donde hayas instalado la aplicación. El servidor probablemente no tenga una pantalla, y aunque la tuviera, el código se ejecuta como servicio y no tiene permiso de acceder a la pantalla. Y aunque lo tuviera, esa pantalla estaría posiblemente a miles de kilómetros del sitio donde el usuario está navegando a la aplicación.

    Conclusión: si estás haciendo una aplicación web, olvídate del OpenFileDialog o de cualquier otro componente de Windows Forms. No se pueden usar en producción, aunque aparenten funcionar en tiempo de desarrollo. El thread no tiene nada que ver en esto.

    Pero el thread sí tiene que ver en otra cosa: No lo puedes usar en una aplicación web ara cambiar desde el thread un control del usuario. ¿Por qué? Pues porque en una aplicación web, cuando el usuario hace cualquier cosa en su página, se transmite una petición al servidor la cual crea una instancia de la clase (con todos los controles), la evalúa, como consecuencia genera un html, el html se devuelve al usuario, y la clase se destruye. Esto dura milésimas de segundo, y después de ello la página queda visible en el navegador del usuario pero ya no queda ni rastro de ella en el servidor. Los controles ya no existen (aunque el usuario esté viendo en su pantalla el resultado de haber convertido esos controles en html). Si durante ese milisegundo que duró la página en el servidor lanzaste un hilo, y al cabo de un rato el hilo quiere presentar algún resultado en un control, no es posible porque para entonces el control ya no existe.

    • Marcado como respuesta Pablo2492 viernes, 30 de octubre de 2020 12:39
    viernes, 30 de octubre de 2020 9:21

Todas las respuestas

  • Hola Pablo2492, 

      

    Gracias por levantar tu consulta en los foros de MSDN. Entendimos su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.  

    Gracias por usar los foros de MSDN.   

     

     Andres Aguilar

     ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    viernes, 30 de octubre de 2020 0:22
    Moderador
  • Olvídalo. No se puede hacer lo que estás haciendo. Estás llamando al OpenFileDialod de Windows Forms, pero a la vista de cómo has declarado el TextBox, se trata de una aplicación Web. Esto puede funcionar en tiempo de desarrollo cuando lo ejecutas desde Visual Studio, porque todo está rodando sobre tu escritorio. Pero en el momento en que pongas la aplicación en producción, cuando un usuario navegue a la misma se intentará abrir el OpenFileDialog en el sitio donde se está ejecutando el código, es decir, en el servidor donde hayas instalado la aplicación. El servidor probablemente no tenga una pantalla, y aunque la tuviera, el código se ejecuta como servicio y no tiene permiso de acceder a la pantalla. Y aunque lo tuviera, esa pantalla estaría posiblemente a miles de kilómetros del sitio donde el usuario está navegando a la aplicación.

    Conclusión: si estás haciendo una aplicación web, olvídate del OpenFileDialog o de cualquier otro componente de Windows Forms. No se pueden usar en producción, aunque aparenten funcionar en tiempo de desarrollo. El thread no tiene nada que ver en esto.

    Pero el thread sí tiene que ver en otra cosa: No lo puedes usar en una aplicación web ara cambiar desde el thread un control del usuario. ¿Por qué? Pues porque en una aplicación web, cuando el usuario hace cualquier cosa en su página, se transmite una petición al servidor la cual crea una instancia de la clase (con todos los controles), la evalúa, como consecuencia genera un html, el html se devuelve al usuario, y la clase se destruye. Esto dura milésimas de segundo, y después de ello la página queda visible en el navegador del usuario pero ya no queda ni rastro de ella en el servidor. Los controles ya no existen (aunque el usuario esté viendo en su pantalla el resultado de haber convertido esos controles en html). Si durante ese milisegundo que duró la página en el servidor lanzaste un hilo, y al cabo de un rato el hilo quiere presentar algún resultado en un control, no es posible porque para entonces el control ya no existe.

    • Marcado como respuesta Pablo2492 viernes, 30 de octubre de 2020 12:39
    viernes, 30 de octubre de 2020 9:21
  • Muchísimas gracias por la alcaración!
    viernes, 30 de octubre de 2020 12:40