Ver la versión completa : [VB.Net] Echadme una mano con esto, que estoy atrancaoooo!
neostalker
14/06/2010, 13:05
Estoy haciendo un programa para gestionar quinielas (y de paso para no perder la práctica programando) y me ha surgido un problema que no sé cómo solucionar... porque no tiene ni pies ni cabeza! xD
El tema es que tengo un formulario desde el cual podré mandar emails que se crea desde la pulsación de un botón en el formulario principal y justo antes de crearlo le mando una serie de datos utilizando un subprograma "friend" que luego utilizará para componer el email. El subprograma en cuestión es este:
Friend Sub precargarDatos(ByVal nodoQuiniela As TreeNode_Modificado, ByVal ayudaActivada As Boolean)
Me.bocadillos.Active = ayudaActivada
Me.nodoQuiniela = nodoQuiniela
End Sub
El treenode modificado es una clase creada por mí que hereda de treenode y almacena datos relativos a la quiniela (partidos, resultados, apuestas...) y esos datos son los que quiero utilizar en el email.
AyudaActivada controla si los tooltip deben de estar activados, nada más.
El problema es que por alguna razón no me guarda el treenode modificado que le paso en uno que tengo declarado en el formulario. Cuando trato de acceder a ese me.nodoQuiniela me dice que está vacío y me provoca una excepción por referencia nula. La gracia es que tengo otros formularios con los que utilizo un código similar y esto no pasa.
Este es el código que utilizo para llamar al formulario desde el formulario principal:
Private Sub BTN_enviarMail_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_enviarMail.Click
Dim formCorreo As New mandarEmail
formCorreo.precargarDatos(CType(Me.TRV_quinielas.S electedNode, TreeNode_Modificado), Me.bocadillos.Active)
mandarEmail.ShowDialog()
End Sub
Se os ocurre alguna manera de solucionarlo? Alguien sabe por qué no guarda los datos que le paso?
Gracias :brindis:
¿Subprograma? yo les llamo subrutinas. Es que subprograma me suena como a procesos o hilos aparte. Bueno, da igual.
Revisa la clase nodoQuiniela a ver si está cogiendo bien los datos, y que no estés pasando una referencia a un objeto local. Ya que se destruiria al salir de su función.
No soy muy experto en VB.Net, pero en el tradicional se crea un Type y se asignan los datos. Con esto te evitas de referencias nulas.
neostalker
14/06/2010, 13:40
¿Subprograma? yo les llamo subrutinas. Es que subprograma me suena como a procesos o hilos aparte. Bueno, da igual.
Revisa la clase nodoQuiniela a ver si está cogiendo bien los datos, y que no estés pasando una referencia a un objeto local. Ya que se destruiria al salir de su función.
No soy muy experto en VB.Net, pero en el tradicional se crea un Type y se asignan los datos. Con esto te evitas de referencias nulas.
La nodoQuiniela está declarada dentro del formulario, por lo que se puede acceder a ella desde cualquier subprograma (o subrutina, como lo queramos llamar :p) de ese formulario y los datos en principio los guarda bien, porque puede acceder a ellos mientras está en ejecución el subprograma precargarDatos. El problema es que cuando se termina ese subprograma, el treenode modificado que le paso (que contiene los datos que necesito) y que a priori debería guardar en me.nodoQuiniela deja de existir por alguna razón que no entiendo y me dice que me.nodoQuiniela está vacío.
GameMaster
14/06/2010, 13:44
Mirate las variables ViewState o utiliza variables de sesion, igual intentas guardar datos en una variable que al recargar la página pierde de nuevo sus datos.
neostalker
14/06/2010, 13:54
Mirate las variables ViewState o utiliza variables de sesion, igual intentas guardar datos en una variable que al recargar la página pierde de nuevo sus datos.
No sé a qué te refieres xD
< - >
Vale, ya lo he solucionado y como de costumbre era una gilipollez como una casa xDDDD
Private Sub BTN_enviarMail_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_enviarMail.Click
Dim formCorreo As New mandarEmail
formCorreo.precargarDatos(CType(Me.TRV_quinielas.S electedNode, TreeNode_Modificado), Me.bocadillos.Active)
mandarEmail.ShowDialog() << EPIC FAIL!!!
End Sub
No me memorizaba los datos porque no estaba llamando al formulario que recibía los datos xDDD
Podéis apedrearme, lo merezco :quepalmo:
GameMaster
14/06/2010, 13:57
Pues el ViewState permite conservar por ejemplo el resultado actual de un gridView en memória, muy util para casos en que estas insertando o borrando líneas del gridView en tiempo de ejecución. La variable de sesion te permite guardar en memória una variable... Vamos, cosillas auxiliares hay muchas, pero claro tampoco he mirado a fondo tu problema para saber lo mejor. Me alegra que ya lo tengas resuelto, pero ten en cuenta estos conceptos que te pueden ayudar en otro marrón :)
No sé a qué te refieres xD
< - >
Vale, ya lo he solucionado y como de costumbre era una gilipollez como una casa xDDDD
Private Sub BTN_enviarMail_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_enviarMail.Click
Dim formCorreo As New mandarEmail
formCorreo.precargarDatos(CType(Me.TRV_quinielas.S electedNode, TreeNode_Modificado), Me.bocadillos.Active)
mandarEmail.ShowDialog() << EPIC FAIL!!!
End Sub
No me memorizaba los datos porque no estaba llamando al formulario que recibía los datos xDDD
Podéis apedrearme, lo merezco :quepalmo:
Hamigo ten cuidadin! no muestras el codigo y no se si ese formulario lo has escondido con un hide o que haces con el ;) pero en aplicaciones que llaman de unos formularios a otros y una vez terminada la tarea, vuelven a los formularios desde los que los has llamado... te recomiendo que crees en cada formulario punteros para volver al principal, parecido a esto:
Dim frmSelWork As New Form <- pon aqui el form al que quieras llamar
frmSelWork.WindowState = FormWindowState.Maximized
frmSelWork.Show()
frmSelWork.FormOrigen(Me) <- Llamo a una rutina publica del formulario al que llamo para pasarle como parametro el formulario presente
Me.Hide()
------------------- Y este codigo en el formulario al que llamas: ------------------------
Private oFrmOrigen As Form
Public Sub FormOrigen(ByVal oFrm As Form)
oFrmOrigen = oFrm
End Sub
Private Sub Exporation_FormClosing(ByVal sender As Object, ByVal e As tem.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
oFrmOrigen.Show()
End Sub
De esta forma cuando ocultas formularios, y los vuelves a llamar, te aseguras de no estas creando a diestro y siniestro instancias del mismo objeto de formulario ;), y es mas si había ya datos tecleados en ese formulario, de esta forma los mantendrías, y no que si simplemente haces un Showdialog, creas una nueva instancia del formulario dejando la anterior oculta para siempre y consumiendo memoria ocultando una y otra vez instancias del form principal.
y a demas tendras en ese puntero al formulario llamante TODOS los datos del treeview que esta tal y como lo dejaste, y todos los objetos disponibles del formulario ;)
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.