Foros del Web » Programación para mayores de 30 ;) » .NET »

Hecho observado en un control usuario web, ¿por qué?

Estas en el tema de Hecho observado en un control usuario web, ¿por qué? en el foro de .NET en Foros del Web. Hola, primero de todo perdonad por el título, pero no sabía como explicarlo. A ver, tengo un proyecto en ASP.NET hecho en C# y tengo ...

  #1 (permalink)  
Antiguo 06/09/2005, 11:58
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
Hecho observado en un control usuario web, ¿por qué?

Hola, primero de todo perdonad por el título, pero no sabía como explicarlo. A ver, tengo un proyecto en ASP.NET hecho en C# y tengo dos controles usuario web hechos por mí que se cargan en un aspPanel según la opción del menú. Pues dependiendo de como agrego controles me pasa una cosa u otra, pongo codigo de carga:
Código PHP:
EditList edtlist = (EditList)this.Page.LoadControl("EditList.ascx");
edtlist.Formatosformatos;
edtlist.TablaOrigen "COMEDOR";

this.Controls.Add(edtlist); //lo cargo en la página y esa pagina en el aspPanel del index.aspx 
o sino lo que hago es arrastrar con el ratón dentro del admin.ascx directamente y luego poniendo este código:

Código PHP:
protected EditList EditListInstalaciones;
....
this.EditListInstalaciones.TablaOrigen "INSTALACIONES";
this.EditListInstalaciones.Formatos formatos
Bueno el primero lo que hace es que cuando le doy a un item de un listbox coge y recarga la pagina principal, sin dejarme agragar a la base de datos (es decir, de repente me hace un Page_Load() por si interesa tengo puest el autopostback=true). Y el segundo en cambio, no realiza esto, pero claro luego no consigo que tras realizar todo lo de la página, pueda llegar ande llega la otra forma.

Espero que vosotros sepaís decirme que pasa aquí, pues yo entre que soy novata y me estoy poniendo histerica ... no saco que sucede.
  #2 (permalink)  
Antiguo 06/09/2005, 14:28
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Parece un caso similar al que acaban de postear en web forms..Problemas con DropdownList ...



Cuando hace un postback si no lo tienes validado, ejecuta todo lo que hay en Page_Load.

AutoPostBack = true, significa que en cada evento que genere el control, la pagina completa será enviada al server.... y se ejecuta el page_load...
  #3 (permalink)  
Antiguo 06/09/2005, 23:50
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
Ayer haciendo depuraciones, quite el autopostback del listbox y eso dejó de pasar, pero va y resulta que ahora me sucede cuando le doy al botón de aceptar, además me di cuenta de que como tengo un control dentro del otro, resulta que va al Page_Load() del principal y entonces se me carga de nuevo el principio.

Hay alguna manera de que no vaya así¿?
  #4 (permalink)  
Antiguo 07/09/2005, 00:52
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
If not IsPostBack

CargarListBox

End If
  #5 (permalink)  
Antiguo 07/09/2005, 01:22
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
no me funciona eso, es lo primero que he intentado pues me da que siempre es true y por tanto entra siempre y vuelvo otra vez al principio.

alguna otra idea. además no quiero q se ejecute ni el page_load() sino lo que tengo de base de datos en el botón acceptar, que aunque le des al click coge y se lo salta¿¿??
  #6 (permalink)  
Antiguo 07/09/2005, 02:12
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
No puede darte siempre True. Si tu coges el Navegador y pones la direccion de la pagina en cuestion, esa primera vez que entre te devolverá False, Seguro.

Despues, con las interacciones de los botones y demás controles, la pagina se irá enviando al servidor y volviendo a la misma. En todos estos viajes desde la misma pagina si que devolverá True.

Suerte!
__________________
..:: moNTeZIon ::..
  #7 (permalink)  
Antiguo 07/09/2005, 02:29
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
De todas maneras creo que para un listbox deberás utilizar el viewstate, para evitar que se pierdan los datos
  #8 (permalink)  
Antiguo 07/09/2005, 02:58
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
lo de true si que es así, lo ejecutado paso por paso y me sale eso. no sé si pondré algo mal. Yo compruebo que if(!this.IsPostBack) Es eso así, no.
  #9 (permalink)  
Antiguo 07/09/2005, 03:24
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Exactamente, lo que pongas dentro de esa condición, sólo se ejecutará una vez al comienzo de la página, lo que pongas en el else se ejecutará solo en la recarga y si lo que pongas fuera se ejecutará siempre
  #10 (permalink)  
Antiguo 07/09/2005, 09:54
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
Nada lo he probado y me sigue dando nada más empezar "True" puede que al estar el control dentro de un aspx. ya tome el valor de true¿?
  #11 (permalink)  
Antiguo 07/09/2005, 10:05
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Cita:
Iniciado por nsmsndie
... y resulta que ahora me sucede cuando le doy al botón de aceptar
Los botones se traducen en inputs de tipo submit...es decir que hacen el posteo a la page...

pero que funcionalidad tiene el boton Aceptar si no es ir a la page?


adicionalmente creo que deberia ser asi la sentencia...

if (!Page.IsPostBack)
  #12 (permalink)  
Antiguo 07/09/2005, 10:41
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
aahh, claro y si se convierte en un submit, me devuelve al page_load() Mi botón cuando le haces click, accede a la BD, actualiza o inserta, según se haya elegido antes pero claro esto no ocurre pues hace el page_load antes.
Entonces que puedo hacer¿? había pensado cambiar el codigo de OperacionBD() a otro sitio, pero donde¿?

Última edición por nsmsndie; 07/09/2005 a las 10:48
  #13 (permalink)  
Antiguo 07/09/2005, 11:13
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
mmmmmm... No, no hace el Page_Load antes, Primero hace el codigo del boton, Luego el Page_Load... Y todo esto en el servidor... Luego vuelve.
__________________
..:: moNTeZIon ::..
  #14 (permalink)  
Antiguo 07/09/2005, 11:17
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
podrias postear el codigo de la funcion page_load y la del boton Aceptar?

  #15 (permalink)  
Antiguo 07/09/2005, 11:17
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
Cita:
Iniciado por moNTeZIon
mmmmmm... No, no hace el Page_Load antes, Primero hace el codigo del boton, Luego el Page_Load... Y todo esto en el servidor... Luego vuelve.
Código:
este es page_load() del control que contiene al otro.
editList.ascx
Código PHP:
// Cargamos el contenido de los controles
                
this.CargaContenido();
            
            
                
//Comprobamos que se quiere hacer
                
if(IsEditing//si está siendo editado
                
{
                    if(
this.ItemIdex == -1//y no hay seleccionado ninguno, cargamos un nuevo item
                        
this.CargaNewEditItem();
                    else                    
//sino cargamos el item seleccionado
                        
this.CargarEditItem((object)this.dgElementos,this.ItemIdex);
                
                } 
codigo del botón aceptar, del control que está dentro del otro:
editItem.ascx-------------

Código PHP:

private void btnAceptar_Click(object senderSystem.EventArgs e)
        {
            
            
//Conexión a la Base de Datos
            
AccesoBD.SQL sql = new AccesoBD.SQL();

            
//Cogemos la ruta relativa de los documentos para almacenarla
            
string rutaDocumento this.imgPreview.ImageUrl.Substring(this.imgPreview.ImageUrl.IndexOf("\\documentos")+1);
            
            
//string encode = Server.HtmlEncode(this.FTBdescripcion.Text);            

            
if(this.IsEdit)//Estamos editando y lo actualizamos
            
{            
                
sql.ActualizaRegistro(this.tabla,this.Id,this.txtTitulo.Text,this.FTBdescripcion.Text,rutaDocumento);
                
this.IsEdit false;
            }
            else
//Estamos creando uno nuevo y lo insertamos
            
{        
                
sql.InsertaRegistro(this.tabla,this.txtTitulo.Text,this.FTBdescripcion.Text,rutaDocumento,0);
            }            
        } 
pues no lo entiendo, porque a mí no me va. Yo el codigo lo tengo en button_click.. tendría que hacer y mediante el depurador he comprobado que por ahi no pasa, se va al page_load del control que lo contiene¿?
  #16 (permalink)  
Antiguo 07/09/2005, 11:40
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Bueno, de hecho siempre se debe ejecutar el page_load... ya que es parte del ciclo de la pagina...

con ella se recontruye la pagina en el servidor en base a la info enviada por el cliente...

ahora, para poder manejar los eventos de un control es necesario tener un manejador de eventos...

por ejemplo


// control.evento //funcion que maneja el evento
this.Button1.Click += new System.EventHandler(this.Button1_Click);

a lo mejor es lo que esta faltando no?


Deberia estar en la funcion

private void InitializeComponent() de la pagina que contiene el control...
  #17 (permalink)  
Antiguo 07/09/2005, 11:44
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
Una cosa así:

this.btnAceptar.Click += new System.EventHandler(this.btnAceptar_Click);

pues lo tengo. ya no sé que más hacer. Alguna idea más¿?
  #18 (permalink)  
Antiguo 07/09/2005, 11:50
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
no deberia tener la validacion del postback?


Código:
if (!this.Page.IsPostBack)
{

// Cargamos el contenido de los controles 
                this.CargaContenido(); 
             
             
                //Comprobamos que se quiere hacer 
                if(IsEditing) //si está siendo editado 
                { 
                    if(this.ItemIdex == -1) //y no hay seleccionado ninguno, cargamos un nuevo item 
                        this.CargaNewEditItem(); 
                    else                    //sino cargamos el item seleccionado 
                        this.CargarEditItem((object)this.dgElementos,this.  ItemIdex); 
                 
                } 

}
  #19 (permalink)  
Antiguo 07/09/2005, 12:28
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
si debería como dices, pero si lo pongo como me da siempre (comprobado en la depuración) True, pues no entra nunca ahí, por eso no lo pongo.
Pero en principio lo que más necesito es lo del botón aceptar no me haga el acceso a la bd antes del page_load()
  #20 (permalink)  
Antiguo 07/09/2005, 13:49
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Cita:
Iniciado por nsmsndie
Ayer haciendo depuraciones, quite el autopostback del listbox y eso dejó de pasar, pero va y resulta que ahora me sucede cuando le doy al botón de aceptar, además me di cuenta de que como tengo un control dentro del otro, resulta que va al Page_Load() del principal y entonces se me carga de nuevo el principio.

Hay alguna manera de que no vaya así¿?

El page_load que debe tener la comprobacion del IsPostBack seria entonces el de la pagina index... o si lo tiene?

ya que dices que se recarga todo desde el principio....
  #21 (permalink)  
Antiguo 08/09/2005, 00:12
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
Pongo la estructura que tengo:

index.aspx -- > page_load() tiene pues la comprobación Page.IsPostBack, además incluye un aspPanel:pnlContenido donde se carga el editList.ascx

editList.ascx este tiene un datagrid que mira la tabla de la BD correspondiente. El page_load() que he puesto más arriba, es el de éste.
editItem.ascx este tiene campos textbox y dos botones "aceptar" y "cancelar", el código del botón aceptar es el que hay puesto más arriba.

Entonces, según un menú (skmmenu para ser exactos) se carga el editList.asx en el panel con unos datos u otros (es decir, se decide la tabla q se cargará). Bueno pues el datagrid tiene dos botones implementados "eliminar" y "editar", y luego fuera del datagrid hay un botón llamado "nuevo" tanto si das a editar o a nuevo, se carga el control editItem.ascx (si es editar con valores en los textbox y si es nuevo, estos están vacios)

Bueno pues cuando le das a aceptar se carga el page_load() del control editList.ascx y no sé porque¿? y deja de ejecutar el codigo que tiene btnaceptar_click() dentro. Ahí radica mi problema, que hago para que ejecute ese código¿?
  #22 (permalink)  
Antiguo 08/09/2005, 10:24
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
A ver si te entendi...

Bueno, los page_load no te los puedes quitar...

la cosa es que mientras este cargado el control edList (control con el grid) siempre se va a ejecutar su respectivo pag_load...

¿cargas ambos controles a la vez, osea en determinado momento ambos estan en la pagina index (dentro del panel) ?
¿o al cargar edItem descargas edList?
  #23 (permalink)  
Antiguo 08/09/2005, 10:55
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
Pues ahora q lo dices, NO lo descargo solo lo oculto... será por eso¿? lo tengo q descargar para que todo funcione bien¿?

Pero la duda que me entra ahora es la siguiente si lo descargo el editList, entonces donde muestro el editItem, pues yo lo muestro en un panel q hay en el editList
  #24 (permalink)  
Antiguo 08/09/2005, 11:41
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38


supongo que tienes dos paneles... el del grid y el del componente para editar el campo...

¿que es lo que ocultas, el panel del grid?

si es asi tal vez, dentro del page_load del edList(el control del grid) podrias validar esa propiedad para determinar si se carga todo o no...eso incluye el cargar de nuevo el control...ya que si vuelves a cargar el control del ediItem se pierden los eventos y debe ser por eso que no se ejecutan el acceso a la BD.


Segun este codigo (que posteaste antes),

1. Siempre vuelves a cargar el contenido de controles (a lo que no le veo mayor problema a menos que tambien se trate de EditItem).
2. Preguntas si se esta editando (esta variable donde la asignas? me imagino que cuando presionas el boton editar del grid ya que luego preguntas por el ItemIndex).
3. Y por ultimo.. como le haces para desactivar IsEditing... ya que cuando postea (al dar click en aceptar) ...vuelve a preguntar... si se esta editando.. y posiblemente tenga el valor de true.. (aunque tal vez la estes desactivando en CargarEditItem/CargaNewEditItem) y si es true se vuelve a cargar el control edItem...

como ves?




Código:
// Cargamos el contenido de los controles 
                this.CargaContenido(); 
             
             
                //Comprobamos que se quiere hacer 
                if(IsEditing) //si está siendo editado 
                { 
                    if(this.ItemIdex == -1) //y no hay seleccionado ninguno, cargamos un nuevo item 
                        this.CargaNewEditItem(); 
                    else                    //sino cargamos el item seleccionado 
                        this.CargarEditItem((object)this.dgElementos,this.    ItemIdex); 
                 
                }

Última edición por Andres95; 08/09/2005 a las 11:52
  #25 (permalink)  
Antiguo 09/09/2005, 04:22
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
Cita:
Iniciado por Andres95

supongo que tienes dos paneles... el del grid y el del componente para editar el campo...

¿que es lo que ocultas, el panel del grid?

si es asi tal vez, dentro del page_load del edList(el control del grid) podrias validar esa propiedad para determinar si se carga todo o no...eso incluye el cargar de nuevo el control...ya que si vuelves a cargar el control del ediItem se pierden los eventos y debe ser por eso que no se ejecutan el acceso a la BD.


Segun este codigo (que posteaste antes),

1. Siempre vuelves a cargar el contenido de controles (a lo que no le veo mayor problema a menos que tambien se trate de EditItem).
2. Preguntas si se esta editando (esta variable donde la asignas? me imagino que cuando presionas el boton editar del grid ya que luego preguntas por el ItemIndex).
3. Y por ultimo.. como le haces para desactivar IsEditing... ya que cuando postea (al dar click en aceptar) ...vuelve a preguntar... si se esta editando.. y posiblemente tenga el valor de true.. (aunque tal vez la estes desactivando en CargarEditItem/CargaNewEditItem) y si es true se vuelve a cargar el control edItem...

como ves?
Si tengo el datagrid en un panel y en el otro cargo el editItem. Y como dices oculto el panel donde está el datagrid, haciendo su propiedad visible="false".
Yo creo que lo primero que dices es lo que me pasa, que tengo q hacer para subsanarlo¿?

El punto 1 y 2. aciertas eso es lo que hago y en el 3. el IsEditing es una propiedad que carga en el ViewState["isedit"]= true or false, y lo desactivo justo cuando se hace la actualizacion en la bd, pero como es el código q no se ejecuta pues ya no sé donde desactivarlo.

Donde lo coloco ahora¿?

¿¿ ??
  #26 (permalink)  
Antiguo 10/09/2005, 11:29
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Perdon pero ayer no estuve en la ofix... y no tenia acceso a inter...

Bueno despues de las apologies...

creo que la variable isEditing es la que esta echando mosca...
ya que siempre se vuelve a cargar el control...entonces es ahi donde se pierde su estado y pues ya no ejecuta el code que actualiza la bd...

Aqui yo checaria estas opciones:

1. Suponiendo que la variable isEditing nos sirve solo para mostrar el contenido el segundo control...inmediatamente que se muestra... la desactivaria... ya que el control ya esta cargado.

Con esto ya no se volveria a crear nuevamente el control.

* Aunque debes evaluar que tanto de pega en tu esquema actual...el desactivar inmediatamente la isEditing.


2. La otra que seria generar eventos para cada control... de forma que desde la pagina que los carga (los controles) ..puedas cacharlos y saber cuando se presiono un boton editar o cuando se presiono el boton aceptar del control 2... pero esta segunda opcion te llevaria mas tiempo y tendrias que adecuar tu codigo para que funcione de esta forma.

3. La otra tambien seria... que valides el status del panel del control 2...es decir, si ya esta visible... ya no vuelvas a cargar el control....solo cuando este en modo no visible...


como ves?
  #27 (permalink)  
Antiguo 11/09/2005, 09:20
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
Yo tampoco he tenido intenernet por eso la tardanza.

Pues q ahora mismo pruebo lo que me has dicho, y te digo si ha funcionado.

--------------------

Ya lo estoy probando y no consigo nada, he realizado una depuración y me da la impresión que cuando hace un page_load() pierde todos lo valores pues me sale q el visible del panel es false cuando lo estoy viendo en la página ?¿?¿

voy a seguir dandole vueltas a ver si consigo algo.

---------------------

Nada, sigo pensando que todo depende de la forma en que cargo los controles unos dentro de otros, porque sino no tiene sentido alguno lo que pasa. Es como si al cargarlos a mano (con LoadControl) pierden los valores que tenían en las variables, pues el visible del panel dichoso me sale false cuando estoy viendolo y tiene que ser true.

Se te ocurre algo más. Sino como harías tú lo de editarItem y EditList?¿?¿ para hacer la parte de administración de mi web.

Última edición por nsmsndie; 11/09/2005 a las 10:32
  #28 (permalink)  
Antiguo 12/09/2005, 08:12
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Cita:
Iniciado por nsmsndie
Nada, sigo pensando que todo depende de la forma en que cargo los controles unos dentro de otros, porque sino no tiene sentido alguno lo que pasa. Es como si al cargarlos a mano (con LoadControl) pierden los valores que tenían en las variables, pues el visible del panel dichoso me sale false cuando estoy viendolo y tiene que ser true.

Se te ocurre algo más. Sino como harías tú lo de editarItem y EditList?¿?¿ para hacer la parte de administración de mi web.

Si se vuelve a cargar...es seguro que todo se reinicia...entonces..debes evitar que eso pase...

para lo de evaluar el estado del panel... deberias considerar la propiedad del panel donde cargas el grid...no la del editItem...

  #29 (permalink)  
Antiguo 14/09/2005, 00:48
Avatar de nsmsndie  
Fecha de Ingreso: julio-2005
Mensajes: 61
Antigüedad: 18 años, 9 meses
Puntos: 0
Como consigo que no se recargue/reinicie ¿?¿? ya no me quedan ideas.
  #30 (permalink)  
Antiguo 14/09/2005, 08:27
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Desactiva la variable editItem inmediatamente despues de que se cargue el control...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:24.