Newsgrupos.com  

Retroceder   Newsgrupos.com > Forum > Newsgroup microsoft.public.es.* 1 Foro > Newsgroup microsoft.public.es.dotnet.vb
Registrarse Preguntas Frecuentes Lista de Foreros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos




Respuesta
 
LinkBack Herramientas Desplegado
  #1 (permalink)  
Antiguo 25-10-2007, 10:48:19
Lixus
 
Mensajes: n/a
Predeterminado Problema en el primer PostBack de una página

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


Responder Con Cita
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Newsgrupos.com
Standard Sponsored Links

  #2 (permalink)  
Antiguo 25-10-2007, 16:10:03
Alberto Poblacion
 
Mensajes: n/a
Predeterminado Re: Problema en el primer PostBack de una página

"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.



Responder Con Cita
  #3 (permalink)  
Antiguo 25-10-2007, 19:24:40
Lixus
 
Mensajes: n/a
Predeterminado Re: Problema en el primer PostBack de una página


"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


Responder Con Cita
  #4 (permalink)  
Antiguo 26-10-2007, 00:44:34
Alberto Poblacion
 
Mensajes: n/a
Predeterminado Re: Problema en el primer PostBack de una página

"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.



Responder Con Cita
  #5 (permalink)  
Antiguo 26-10-2007, 10:58:57
Lixus
 
Mensajes: n/a
Predeterminado Re: Problema en el primer PostBack de una página

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.






Responder Con Cita
  #6 (permalink)  
Antiguo 26-10-2007, 13:48:46
Alberto Poblacion
 
Mensajes: n/a
Predeterminado Re: Problema en el primer PostBack de una página

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.
>
>
>
>
>
>


Responder Con Cita
  #7 (permalink)  
Antiguo 26-10-2007, 17:18:59
Lixus
 
Mensajes: n/a
Predeterminado Re: Problema en el primer PostBack de una página

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>&nbsp;
<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 --->>>
>>
>>



Responder Con Cita
 
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Trackbacks are habilitado
Pingbacks are habilitado
Refbacks are habilitado


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





Powered by: vBulletin, Versión 3.6.8
Derechos de Autor ©2000 - 2008, Jelsoft Enterprises Ltd.

LinkBacks Enabled by vBSEO 3.1.0 © 2007, Crawlability, Inc.