Acceder a un metodo en una clase desde otra clase

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
adrianeric
Forista Nuevo
Forista Nuevo
Mensajes: 6
Registrado: Mié Feb 16, 2011 9:07 pm

Acceder a un metodo en una clase desde otra clase

Mensaje por adrianeric » Mié Feb 16, 2011 9:11 pm

Cuento mi problema, antes aclaro que mis conocimientos en C# son muy basicos y quizas por eso es esta duda (vengo de VB.NET) y ahora estoy desarrollando con monodevelop y GTK2 pero en c#. La historia es así, tengo un formulario (clase) llamada Form1 el cual tiene un control o widget que es un lista (treeview en GTK), dentro de la clase Form1 hay un metodo que "llena" este control con datos desde mysql. Cuando necesito agregar un item a este control, abro otro formulario llamado Form2 el cual lleno con datos y al darle en el boton aceptar graba el nuevo registro en la base de datos, pero en esta parte necesito volver a llenar el control (treeview) con los datos actualizados desde la BD pero no puedo acceder desde el método dentro de Form2 al método que necesito y que está dentro de Form1, todo está declarado como public y tbien intenté declarar como static pero no logro lo mismo acceder. Alguien me puede orientar o remitirme a algun ejemplo o algo?, mi aplicacion está casi terminada, pero me trabó esta tontera.
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Acceder a un metodo en una clase desde otra clase

Mensaje por akodo » Mié Feb 16, 2011 11:59 pm

Yo pondría algún "mensaje de control" para saber que el método se ejecuta. Lo típico: "ejecutando el método1 de la clase Bla", lo sacas por pantalla y así al menos sabes que el método se ejecuta.

En cuanto a la base de datos, revisa que se guardan los cambios nada más acabar con el formulario, porque quizás lo que estés haciendo es encargar la operación pero no se llega a llevar a cabo, con lo que a la hora de obtener los datos sacas los mismo que la última vez.

Otra opción es que la base de datos se actualice correctamente, obtengas bien los datos, pero no llegues a mostrarlos. A la hora de actualizar los datos que se muestran, es posible que tengas que indicar a GTK que los datos han cambiado y que tiene que volver a mostrarlos repintando la pantalla.

Realmente me extraña que no puedas acceder al método teniendolo como public. Tampoco tengo experiencia con C#, pero el error que te muestra y el código que tienes puede resultar de gran ayuda para resolver el problema. Sin dar más datos, lo que he puesto es lo que se me ocurre que puede estar pasando.

Un saludo.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
adrianeric
Forista Nuevo
Forista Nuevo
Mensajes: 6
Registrado: Mié Feb 16, 2011 9:07 pm

Re: Acceder a un metodo en una clase desde otra clase

Mensaje por adrianeric » Lun Feb 21, 2011 4:18 am

Verifique satisfactoriamente que los nuevos datos se graben en la base de datos (pero eso lo hago desde la clase Form2 directamente), lo que necesito es actualizar los datos en el treeview con los datos recien actualizados desde la base de datos, esto lo hago con un metodo que se encuentra en la clase Form1 que siempre ha estado abierta. En otro foro me dijeron que haga una referencia en el Form2 al Form1, eso hice y así almenos me aparecen listados los metodos que estan en Form1 (antes ni eso sucedía), pero cuando hago dentro del metodo que esta dentro del Form2: Form1.LlenadoTreeView() mi aplicación se cierra inesperadamente, ya verifiqué y no se logra ejecutar ni una istrucción del metodo al que llamo (LlenadoTreeView), el problema es de ambito de vida de los metodos y clases creo, al compilar la aplicación, el compilador no encuentra error alguno, esto es obvio pues no podría haber ejecutado la aplicación nunca. La verdad el tema es bastante frustrante.
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Acceder a un metodo en una clase desde otra clase

Mensaje por akodo » Lun Feb 21, 2011 11:44 pm

Algún error debería mostrar, ¿no?, al menos en tiempo de ejecución. Postea el error a ver si sacamos algo.

Prueba a poner algún mensaje por consola en el método, y asegurate de hacer un "flush" (o algo similar) para forzar el vaciado del buffer y que el mensaje se muestre. Es posible que, si has puesto un mensaje y el error ocurre justamente después, el mensaje no se muestre porque ha quedado en el buffer.

Si puedes dejar el código de los dos forms es posible que vea algo más.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
adrianeric
Forista Nuevo
Forista Nuevo
Mensajes: 6
Registrado: Mié Feb 16, 2011 9:07 pm

Paso codigo resumido para analizar

Mensaje por adrianeric » Mar Feb 22, 2011 11:09 pm

namespace GestionRRHH_mono_Stetic
{
public partial class Form2 : Gtk.Window
{
public ListStore ListstoreEmpleados, liststoreMarcaciones;

bool EsfilaNueva = false;
public TreePath TreepathSeleccionado;
string LegajoNuevo, FechaNueva, HoraNueva, NotaNueva;
MessageDialog dialogoPregunta;

bool EstadoEmpleadosActivos;
bool EstadoEmpleadosInactivos;



public Form2 () : base(Gtk.WindowType.Toplevel)
{
this.Build ();
....
}


public void llenadoListaEmpleados()
{

//leo el estado de mis opciones en el menu
EstadoEmpleadosActivos = VerEmpleadosActivosAction.Active;
EstadoEmpleadosInactivos = VerEmpleadosInactivosAction.Active;

//en SelectStr guardo la cadena SQL que extrae los datos de mi base de datos

MySqlCommand Cmmd = new MySqlCommand(SelectStr, MainWindow.CnxGral);
MySqlDataReader myReader = null;

try
{
myReader = Cmmd.ExecuteReader();
}
catch (MySqlException ex)
{
MainWindow.muestraDialogo("Error devuelto por BD", "Error Nº" +

ex.Number.ToString() + ": " + ex.Message, MessageType.Error);
return;
}

//Lleno con datos el liststore correspondiente al la lista
ListstoreEmpleados.Clear();

while (myReader.Read()) {
ListstoreEmpleados.AppendValues(myReader["IdEmpleado"].ToString

(),myReader["apellido"].ToString(),
myReader["nombre"].ToString());

}



myReader.Close();
myReader.Dispose();
Cmmd = null;


}



namespace GestionRRHH_mono_Stetic
{
public partial class Empleados : Gtk.Window
{

string dniOriginal;
public Form2 Frmprincipal;

public Empleados () : base(Gtk.WindowType.Toplevel)
{
this.Build ();

this.btnAceptar.Clicked += HandleBtnAceptarhandleClicked; this.btnCancelar.Clicked += HandleBtnCancelarhandleClicked; TextIdCategoria.Changed += HandleTextIdCategoriaChanged; }

private void HandleBtnAceptarhandleClicked (object sender, EventArgs e)
{

switch (this.Title.ToString())
{
case "Alta de empleado":

AltaEmpleadoBD(); break;

case "Edición de empleado": IngresoEmpleadoEditado();

break;
}
}


public void AltaEmpleadoBD()
{
string nombre = null;

string apellido = null;
string dni = null;
nombre = this.TextNombre.Text;
apellido = this.TextApellido.Text;
dni = this.TextDNI.Text;
//Controlo que los datos importantes no sean nulos

if (nombre.Length == 0 | apellido.Length == 0 | dni.Length == 0)
{

MainWindow.muestraDialogo("Datos faltantes", "Los valores de Nombre, Apellido y DNI no pueden ser nulos\n" + "a la hora de ingresar un

nuevo empleado.", MessageType.Warning); return;
}
//Defino variables y les asigno valores para crear cadena SQL
....
//Creo la cadena SQL correspondiente

string CadenaSQL = "INSERT INTO empleados" + "Nombre,Apellido,DNI,CUIL,Direccion,...)";

MySqlCommand comando = new MySqlCommand(CadenaSQL, MainWindow.CnxGral); try {

comando.ExecuteNonQuery();
}
catch (MySqlException ex)
{

MainWindow.muestraDialogo("Error devuelto por BD", ex.Number + ": " +

ex.Message, MessageType.Error);
}
comando = null;

this.Destroy();

Frmprincipal.llenadoListaEmpleados(); //aqui la aplicacion se
cierra sin ningún mensaje de error
}
}
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Acceder a un metodo en una clase desde otra clase

Mensaje por akodo » Mié Feb 23, 2011 12:02 am

Código: Seleccionar todo

//leo el estado de mis opciones en el menu
EstadoEmpleadosActivos = VerEmpleadosActivosAction.Active;
EstadoEmpleadosInactivos = VerEmpleadosInactivosAction.Active;
No veo que "VerEmpleadosActivosAction" ni "VerEmpleadosInactivosAction" estén declaradas

PD: La próxima vez que postees código utiliza la etiqueta "

Código: Seleccionar todo

" para poder leerlo más fácilmente
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
adrianeric
Forista Nuevo
Forista Nuevo
Mensajes: 6
Registrado: Mié Feb 16, 2011 9:07 pm

Solucioné el problema pero no me convence.

Mensaje por adrianeric » Mié Feb 23, 2011 9:18 pm

ah, ok, si perdon no sabía :? , grcias, la prox vez posteo mejor. Solucioné el problema creando una nueva instancia del formulario1(en mi codigo llamado Form2 :D ) dentro del metodo que esta en la clase Empleados de la foma:

Código: Seleccionar todo

public void AltaEmpleadoBD()
{
.....
Form2 formulario = new Form2;
formulario.Hide();
formulario.LlenadoListaEmpleados();
formulario.Destroy();
}
y...así se refresca la lista aunque la pantalla se ensucia con el formulario que aparece y desaparece, lo que voy a probar es quitar la instrucción ShowAll() que se encuentra en el codigo generado al crear el formulario en el método Build() para que no se muestre el formulario al instanciarlo. Lamentablemente no me convence la solución pero el tiempo apremia y no puedo seguir dadole vueltas al tema, ya aprenderé la solución correcta y corregiré el codigo en su momento, te comento cdo pruebe si di con una solución mas limpia. Muchas gracias por tu preocupación. Saludos.
Última edición por mcun el Mié Feb 23, 2011 9:18 pm, editado 1 vez en total.
Razón: Tema unido
Avatar de Usuario
mcun
Administrador
Administrador
Mensajes: 3888
Registrado: Lun Abr 19, 2010 12:30 am
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)
Contactar:

Re: Acceder a un metodo en una clase desde otra clase

Mensaje por mcun » Mié Feb 23, 2011 9:21 pm

adrianeric estas usando el botón nuevo mensaje en lugar de Publicar respuesta nuevo mensaje es para iniciar un tema nuevo para continuar con una conversación ya iniciada tienes que usar publicar una respuesta, de esa forma todos lo0s mensajes quedan unidos

saludos
Los programadores de verdad no documentan. La documentación es para los idiotas que no pueden leer un volcado de memoria.

Trusted Network and Developer | Lee el Reglamento !! |WIKI-EL | Twitter @mr_mcun
Debian + TTY | ArchLinux + awesome | openSUSE + Gnome-Shell | Linux User #508809
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje