![]() |
| |||||||
| Registrarse | Preguntas Frecuentes | Lista de Foreros | Calendario | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
| | LinkBack | Herramientas | Desplegado |
| |||
| Hola a todos, a ver si me explico. En mi Web, he creado un control personalizado que utilizo como cabecera de todas las páginas. El texto que aparece en las páginas, son etiquetas que voy rellenando dependiendo de lo que deba aparecer. El caso es que estoy haciendo la Web multilingüe (en principio solo español e inglés). Para ello, he puesto en el control personal que hace la cabecera dos banderitas como ImageButton, y el código de ese control es tan simple como esto: <<<--- cabecera --->>> Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '* Aquí no va nada End Sub Sub setIdioma(ByVal o As Object, ByVal e As ImageClickEventArgs) Dim img As New ImageButton img = CType(o, ImageButton) Select Case img.ID Case "imgBandera01" Session("idioma") = "es" Case "imgBandera02" Session("idioma") = "en" End Select End Sub <<<//--- cabecera --->>> setIdioma se ejecuta cada vez que hago clic sobre cualquiera de las banderas. Con esto cargo en una variable de sesión el idioma en que se deben mostrar las cosas. Cada página me carga, en el evento load, el texto que deben mostrar las etiquetas principales, también de manera muy simple: <<<--- cargar página --->>> Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '* Comprobar si hay idioma '* y si no lo hay cargo uno por defecto. If Session.Item("idioma") Is Nothing Then Session("idioma") = "es" End If '* Cargo la clase en que defino los textos Dim textos As New oIndex '* Se toma el idioma de la sesión Dim strIdioma As String = CStr(Session("idioma")) '* Se cargan los textos en las etiquetas Me.lblIndex01.Text = textos.texto01(strIdioma) Me.lblIndex02.Text = textos.texto02(strIdioma) Me.lblIndex03.Text = textos.texto03(strIdioma) '* Coloco una etiqueta para controlar el idioma de la sesión. Me.lblTest01.Text = strIdioma ... <<<//--- cargar página --->>> Los textos los saco de una clase que he creado en la que el texto de cada etiqueta sale de una propiedad, también muy simple: <<<--- propiedad --->>> Public ReadOnly Property texto03(ByVal idioma As String) As String Get Select Case idioma Case "es" Return "Formulario de búsqueda" Case "en" Return "Search form" End Select End Get End Property <<<//--- propiedad --->>> Lo cierto es que todo funciona perfectamente, excepto una cosa. Cuando hago clic sobre una banderita para cambiar de idioma, en el primer PostBack no hace nada, todo sigue igual, en cambio el idioma se carga en la sesión, porque cualquier cosa que haga después ya la muestra en el idioma seleccionado. ¿Qué debería hacer para que el idioma cambiara en ese primer PostBack inmediato a hacer clic sobre la bandera? Porque después de eso todo funciona ya perfectamente. Posiblemente es una tontería que se me escapa, pero es que no soy capaz de dar con una solución. No sé si me he explicado bien, espero que se haya entendido mi problema, y perdonad por la longitud del mensaje. Gracias por la ayuda. Un saludo |
| | ||||
| ||||
| |
| |||
| "Lixus" <lixus1***ESTOSOBRAhotmail.com> wrote in message news:%2322MtwuFIHA.3980***TK2MSFTNGP03.phx.gbl... > [...] > Lo cierto es que todo funciona perfectamente, excepto una cosa. > Cuando hago clic sobre una banderita para cambiar de idioma, en el primer > PostBack no hace nada, todo sigue igual, en cambio el idioma se carga en > la sesión, porque cualquier cosa que haga después ya la muestra en el > idioma seleccionado. > > ¿Qué debería hacer para que el idioma cambiara en ese primer PostBack > inmediato a hacer clic sobre la bandera? Porque después de eso todo > funciona ya perfectamente. El problema es que siempre se ejecuta primero el Page_Load y luego la rutina que procesa el Click. Como la traducción de los textos la estableces en el Page_Load, para cuando se ejecuta el click y te cambia el idioma en el Session ya se han escrito los textos en el idioma que había antes. Tendrás que sacar del Page_Load la rutina que hace la traducción y dejarla en un método aparte. Ese método tendrás que invocarlo cuando se ejecute el Click del cambio de idioma. Como este Click está en el ascx y la rutina está en el formulario contenedor, tendrás que trasferir la llamada entre ambos. Una forma de hacerlo consiste en declarar un evento público de "cambio de idioma" en el ascx, que dispararás cuando te pinchen en el icono de cambio, y en el formulario contenedor conectar a ese evento (por ejemplo, usando AddHandler) la rutina que traduce los textos. |
| |||
| "Alberto Poblacion" <earthling-quitaestoparacontestar***poblacion.org> escribió en el mensaje news:edMIokxFIHA.5328***TK2MSFTNGP05.phx.gbl... > "Lixus" <lixus1***ESTOSOBRAhotmail.com> wrote in message > news:%2322MtwuFIHA.3980***TK2MSFTNGP03.phx.gbl... > > [...] > > El problema es que siempre se ejecuta primero el Page_Load y luego la > rutina que procesa el Click. Como la traducción de los textos la > estableces en el Page_Load, para cuando se ejecuta el click y te cambia el > idioma en el Session ya se han escrito los textos en el idioma que había > antes. > Tendrás que sacar del Page_Load la rutina que hace la traducción y > dejarla en un método aparte. Ese método tendrás que invocarlo cuando se > ejecute el Click del cambio de idioma. Como este Click está en el ascx y > la rutina está en el formulario contenedor, tendrás que trasferir la > llamada entre ambos. Una forma de hacerlo consiste en declarar un evento > público de "cambio de idioma" en el ascx, que dispararás cuando te pinchen > en el icono de cambio, y en el formulario contenedor conectar a ese evento > (por ejemplo, usando AddHandler) la rutina que traduce los textos. > > > Muchas gracias por la respuesta, esto ya me va orientando. Ahora me surge otra duda. Si en cada formulario tengo un método tal que: Sub setEtiqueta( ) '* Código para cargar las etiquetas End Sub ¿Como puedo acceder a este método desde el control "header.ascx", cualquiera que sea el formulario en el que me encuentre?. Es decir, definir un objeto Form y cargarle el parent de ese ascx cualquiera que sea el formulario en el que se encuentre. Porque en ese formulario siempre habrá un método setEtiqueta( ). Lo he intentado con un AddHandler, pero me falta ese paso. Muchas gracias por tu ayuda. Saludos |
| |||
| "Lixus" <lixus1***ESTOSOBRAhotmail.com> wrote in message news:e3JBQRzFIHA.3848***TK2MSFTNGP05.phx.gbl... > Si en cada formulario tengo un método tal que: > > Sub setEtiqueta( ) > '* Código para cargar las etiquetas > End Sub > > ¿Como puedo acceder a este método desde el control "header.ascx", > cualquiera que sea el formulario en el que me encuentre?. Se podría hacer por refexión, o implementando un mismo Interface en todos los forms. Pero en cualquier caso no es fácil. Por eso te sugería la alternativa contraria, es decir, no acceder al método desde el ascx, sino disparar un evento desde el ascx y que sea el formulario contenedor el que llame al método cuando le llegue el evento. > Es decir, definir un objeto Form y cargarle el parent de ese ascx > cualquiera que sea el formulario en el que se encuentre. Porque en ese > formulario siempre habrá un método setEtiqueta( ). > > Lo he intentado con un AddHandler, pero me falta ese paso. En el ascx, pon un evento y dispáralo: Public Event IdiomaCambiado(sender as Object, e as EventArgs) ... Private Sub BotonIdioma_Click(sender as Object, e as EventArgs) ... 'Guardar idioma ... IdiomaCambiado(Me, EventArgs.Empty) End Sub Y en cada Form conecta la rutina al evento: Sub Page_Load(...) AddHandler Header1.IdiomaCambiado, AddressOf setEtiqueta ... End Sub ... Sub setEtiqueta(sender as Object, e as EventArgs) '* Código para cargar las etiquetas End Sub Y ya está, con eso se te tiene que ejecutar el setEtiqueta cuando hagan click en el cambio de idioma en el header.ascx. |
| |||
| Hola Alberto, ya sé que debo ser torpe, pero es que sigue sin funcionarme. Copio el código de la cabecera (header_db.ascx) <<<--- cabecera --->>> Public Class header_db Inherits System.Web.UI.UserControl #Region " Web Form Designer Generated Code " [...] #End Region Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '* No tiene código End Sub Public Event changeIdioma(ByVal o As Object, ByVal e As EventArgs) Sub setIdioma(ByVal o As Object, ByVal e As ImageClickEventArgs) Dim img As New ImageButton img = CType(o, ImageButton) Select Case img.ID Case "imgBandera01" Session("idioma") = "es" Case "imgBandera02" Session("idioma") = "en" End Select RaiseEvent changeIdioma(Me, EventArgs.Empty) End Sub End Class <<<//--- cabecera --->>> El código que carga la página es: <<<--- página/formulario --->>> Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '* Lanzamos la carga de etiquetas. If Not Me.IsPostBack Then setEtiqueta(Me, EventArgs.Empty) Else Dim cabecera As New header_db AddHandler cabecera.changeIdioma, AddressOf setEtiqueta End If End Sub Public Sub setEtiqueta(ByVal o As Object, ByVal e As EventArgs) '* Comprobar el idioma If Session.Item("idioma") Is Nothing Then Session("idioma") = "es" End If Dim textos As New oIndex Dim strIdioma As String = CStr(Session("idioma")) Me.lblIndex01.Text = textos.texto01(strIdioma) Me.lblIndex02.Text = textos.texto02(strIdioma) Me.lblIndex03.Text = textos.texto03(strIdioma) Me.lblTest01.Text = strIdioma End Sub <<<//--- página/formulario --->>> Lo cierto es que así, en un PostBack no se ejecuta nunca el método setEtiqueta( ). He intentado dejar la línea del AddHandler como AddHandler Header_db1.changeIdioma, AddressOf setEtiqueta Header_db1 es el nombre del control personal en el formulario, pero me dice que ese nombre no se ha declarado, y tampoco funciona. No consigo que se lance setEtiqueta en un postback. |
| |||
| Así, a simple vista, tiene buen aspecto. Lo único que se me ocurre que se puede haber escapado (porque no se ve en el código fuente que has enviado) es la llamada a la rutina setIdioma dentro de la cabecera. ¿Has comprobado que se esté llamando a esta rutina al hacer click en el botón de selección de idioma? Si no es eso, pon puntos de ruptura en las distintas rutinas, a ver en qué orden se disparan, no vaya a ser (creo que no) que el Click en el ascx se dispare antes que el Page_Load del aspx. Si fuera así, tendrías que sacar el AddHandler del Page_Load y llevarlo al Page_Init. "Lixus" <lixus1***ESTOSOBRAhotmail.com> wrote in message news:OAi$Vb7FIHA.5980***TK2MSFTNGP04.phx.gbl... > ya sé que debo ser torpe, pero es que sigue sin funcionarme. > Copio el código de la cabecera (header_db.ascx) > > <<<--- cabecera --->>> > Public Class header_db > Inherits System.Web.UI.UserControl > > #Region " Web Form Designer Generated Code " > [...] > #End Region > > Private Sub Page_Load(ByVal sender As System.Object, ByVal e As > System.EventArgs) Handles MyBase.Load > '* No tiene código > End Sub > > Public Event changeIdioma(ByVal o As Object, ByVal e As EventArgs) > > Sub setIdioma(ByVal o As Object, ByVal e As ImageClickEventArgs) > > Dim img As New ImageButton > img = CType(o, ImageButton) > Select Case img.ID > Case "imgBandera01" > Session("idioma") = "es" > Case "imgBandera02" > Session("idioma") = "en" > End Select > > RaiseEvent changeIdioma(Me, EventArgs.Empty) > End Sub > End Class > <<<//--- cabecera --->>> > > El código que carga la página es: > > <<<--- página/formulario --->>> > Private Sub Page_Load(ByVal sender As System.Object, ByVal e As > System.EventArgs) Handles MyBase.Load > '* Lanzamos la carga de etiquetas. > If Not Me.IsPostBack Then > setEtiqueta(Me, EventArgs.Empty) > Else > Dim cabecera As New header_db > AddHandler cabecera.changeIdioma, AddressOf setEtiqueta > End If > > End Sub > > Public Sub setEtiqueta(ByVal o As Object, ByVal e As EventArgs) > '* Comprobar el idioma > If Session.Item("idioma") Is Nothing Then > Session("idioma") = "es" > End If > Dim textos As New oIndex > Dim strIdioma As String = CStr(Session("idioma")) > Me.lblIndex01.Text = textos.texto01(strIdioma) > Me.lblIndex02.Text = textos.texto02(strIdioma) > Me.lblIndex03.Text = textos.texto03(strIdioma) > Me.lblTest01.Text = strIdioma > > End Sub > <<<//--- página/formulario --->>> > > > Lo cierto es que así, en un PostBack no se ejecuta nunca el método > setEtiqueta( ). > He intentado dejar la línea del AddHandler como > > AddHandler Header_db1.changeIdioma, AddressOf setEtiqueta > > Header_db1 es el nombre del control personal en el formulario, pero me > dice que ese nombre no se ha declarado, y tampoco funciona. > > No consigo que se lance setEtiqueta en un postback. > > > > > > |
| |||
| El AddHandler tampoco funciona en el Page_Init Copio el código del formulario que lanza el cambio de idioma: <<<--- formulario --->>> [...] <tr> <td id="tools" align="right" width="100%" bgColor="#003399" height="20"> <asp:imagebutton id="imgBanderaES" CausesValidation="False" OnClick="setIdioma" ToolTip="Versión en español" ImageUrl="../images/bandera_es.gif" runat="server"></asp:imagebutton> <asp:imagebutton id="imgBanderaEN" CausesValidation="False" OnClick="setIdioma" ImageUrl="../images/bandera_en.gif" runat="server" tooltip="English version"></asp:imagebutton></td> </tr> [...] <<<//--- formulario --->>> Es como si la referencia al evento no apuntara correctamente. He probado con los puntos de interrupción. Pongo cómo va el flujo del código según lo que se está haciendo. Al abrir la página lo primero que se ejecuta, del código que se ve más abajo, es la línea 29, salta a la línea 33, salta a la línea 41, salta a las líneas 48 y siguientes (carga los textos de las etiquetas), y abre la página. Al pulsar sobre la bandera inglesa salta a la línea 29, salta a la línea 36, salta a la línea 15, salta a la línea 23, salta a la línea 26, y abre la página sin hacer nada con el idioma. Pero no se ejecuta el método setEtiqueta( ) No sé porqué no se ejecuta toda la secuencia para el cambio del idioma. >> <<<--- cabecera --->>> 01> Public Class header_db 02> Inherits System.Web.UI.UserControl 03> 04> #Region " Web Form Designer Generated Code " 05> [...] 06> #End Region 07> 08> Private Sub Page_Load(ByVal sender As System.Object, ByVal e As 09> System.EventArgs) Handles MyBase.Load 10> '* No tiene código 11> End Sub 12> 13> Public Event changeIdioma(ByVal o As Object, ByVal e As EventArgs) 14> 15> Sub setIdioma(ByVal o As Object, ByVal e As ImageClickEventArgs) 16> 17> Dim img As New ImageButton 18> img = CType(o, ImageButton) 19> Select Case img.ID 20> Case "imgBandera01" 21> Session("idioma") = "es" 22> Case "imgBandera02" 23> Session("idioma") = "en" 24> End Select 25> 26> RaiseEvent changeIdioma(Me, EventArgs.Empty) 27> End Sub 28> End Class >> <<<//--- cabecera --->>> >> >> El código que carga la página es: >> >> <<<--- página/formulario --->>> 29> Private Sub Page_Load(ByVal sender As System.Object, ByVal e As 30> System.EventArgs) Handles MyBase.Load 31> '* Lanzamos la carga de etiquetas. 32> If Not Me.IsPostBack Then 33> setEtiqueta(Me, EventArgs.Empty) 34> Else 35> Dim cabecera As New header_db 36> AddHandler cabecera.changeIdioma, AddressOf setEtiqueta 37> End If 38> 39> End Sub 40> 41> Public Sub setEtiqueta(ByVal o As Object, ByVal e As EventArgs) 42> '* Comprobar el idioma 43> If Session.Item("idioma") Is Nothing Then 44> Session("idioma") = "es" 45> End If 46> Dim textos As New oIndex 47> Dim strIdioma As String = CStr(Session("idioma")) 48> Me.lblIndex01.Text = textos.texto01(strIdioma) 49> Me.lblIndex02.Text = textos.texto02(strIdioma) 50> Me.lblIndex03.Text = textos.texto03(strIdioma) 51> Me.lblTest01.Text = strIdioma 52> 53> End Sub >> <<<//--- página/formulario --->>> >> >> |
| |
| |
![]() |
| Herramientas | |
| Desplegado | |
| |
Temas Similares | ||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Primer problema con la DRZ... :-O | IvanSBK | Newsgroup es.charla.moteros | 54 | 16-05-2008 23:24:01 |
| Primer problema con moto e importador. | Jose Carlos | Newsgroup es.charla.moteros | 2 | 14-05-2008 20:13:59 |
| TS: no imprime la primer página | Javier López | Newsgroup microsoft.public.es.windows.server.general | 2 | 16-04-2008 10:04:00 |
| {SPV} primer expulsado, primer judas, primer líder | zampo | Newsgroup es.rec.tv.concursos | 0 | 25-01-2008 02:15:23 |
| Problema con do PostBack jolines no se como controlarlo :-s | Xavi | Newsgroup microsoft.public.es.java | 6 | 24-11-2005 00:04:15 |