none
Obtener Datos de un Datatable de una clase RRS feed

  • Pregunta

  •  Hola gente del foro estoy realizando un programa en el que hago menejo de DataTable y en tng una libreria de clase en la que tng creada la clase Persona que hereda a la clase Usuario. El tema es el siguiente desde un formulario que se llama frmRegistrarUsuario obtengo datos de textbox y los envio por parametro a un metodo del formulario login en el cual esta instanciada la clase Usuario que hereda de la clase Persona en la que tengo una funcion. Dentro de esta funcion intento recorrer la TablaAlumno para obtener algunos datos que previamente registre en esta tabla. Como no podia recorrer la TablaAlumno con el foreach utilice un do while para hacerlo y obtube como respuesta -No existe ninguna fila en la posicion 0- pero al recorrerla desde otro button en el mismo formulario y con otra funcion que retorna que existe un registro. No tengo idea de porque no  porque no puedo recorrer la funcion  y obtener los ratos de ella para luego guardarla en la TablaUsuario.

    Aclaro que solo instacio una sola ves en el formulario Login a la Clase Usuario que hereda de la clase Persona y apartir de ahi me manejo con mensajes.

    //esto hago en el frmRegistrarUsuario //************************************************************************************************************************** //OBTENGO LOS DATOS DE LOS TEXTBOX Y LOS ENVIO POR PARAMETROS A UN METODO DE LA FORMULARIO LOGIN private void btnGuardar_Click(object sender, EventArgs e) { Guardar_Registros_Usuario(); } public void Guardar_Registros_Usuario() { string Mensaje = ""; try { int i = Login.VerificarRegistrosUsuarios(); MessageBox.Show(i.ToString()); if (i == 0) { Login.CrearTablaUsuario(); MessageBox.Show("Creamos la Tabla"); } string ApellidoUsu = txtApellido.Text; string NombreUsu = txtNombre.Text; int dniUsu = Convert.ToInt32(txtDNI.Text); string ContrasenaUsu = txtContrasena.Text; string ClaveUsu = txtClave.Text; MessageBox.Show(ApellidoUsu+" "+NombreUsu+" "+dniUsu+" "+ContrasenaUsu+" "+ClaveUsu); Login.GuardarNuevoUsuarioAlumno(ApellidoUsu, NombreUsu, dniUsu, ContrasenaUsu, ClaveUsu); } catch (Exception ex) { Mensaje = ex.Message; } }

    private void button1_Click(object sender, EventArgs e)
            {
                int n = Login.VerificarRegistrosAlumnos();
                MessageBox.Show(n.ToString());
            } // fORMULARIO LOGIN //************************************************************************************************************************** // ENVIA LOS PARAMETROS AL METODO GuardarNuevoUsuarioAlumno() DE LA CLASE PERSONA public void GuardarNuevoUsuarioAlumno(string ApellidoUsu, string NombreUsu, int dniUsu, string ContrasenaUsu, string ClaveUsu) { MessageBox.Show(ClaseUsuario.Registrar_Usuario_Alumno(ApellidoUsu,NombreUsu, dniUsu,ContrasenaUsu,ClaveUsu)); } // CLASE PERSONA //REGISTRA UN USUARIO SI ESTA REGISTRAADO COMO ALUMNO O PROFESOR public string Registrar_Usuario_Alumno(string apellido, string nombre, int dni, string contrasena, string clave) { string Rta = "0"; try { int fila = 0; int f = TablaAlumno.Rows.Count; do { if (TablaAlumno.Rows.Count > 0) { Rta = "1"; DataRow NuevoUsuario = TablaUsuario.NewRow(); Apellido = TablaAlumno.Rows[fila]["Apellido"].ToString(); DNI = Convert.ToInt32(TablaAlumno.Rows[fila]["DNI"].ToString()); if ((Apellido == apellido) && (DNI == dni)) { Nombre = nombre; Contrasena = contrasena; Clave = clave; TablaUsuario.Rows.Add(Apellido, Nombre, DNI, Contrasena, Clave); fila++; } } } while (fila < f); } catch (Exception ex) { Rta = ex.Message; } return Rta; }

    //****************************************************************************************************************************
    //EL FOREACH SOLO LO UTILIZO PARA VERIFICAR SI RECORRE LA TABLA Y ME DEVULVE REGISTROS        

    // CALCULAMOS LOS REGISTROS QUE HAY EN EL DATATABLE ALUMNOS
            public int Verificar_Registros_Alumnos()
            {
                if(TablaAlumno.Rows.Count > 0)
                {
                    x = TablaAlumno.Rows.Count;
                }
                return x;
            }

    Como veran el el codigo de la clase deberia retornarme un string = 1 pero no me retorna nada y solo acelera el procesador de mi pc como si estubia en un proceso de sobrecarga. Y si le quito el if entonces me debuelve un mensaje de error (No existe ningula fila en la posicion 0) pero si recorro la TablaAlumno con otro Button del mismo fomulario me retorna que existe un registro

    sábado, 14 de diciembre de 2019 14:25

Todas las respuestas

  • Tú seguramente lo tienes clarísimo porque has pasado muchas horas mirándolo antes de preguntar en el foro, pero está demasiado liado como para que aquí podamos entender dónde está cada cosa y qué es lo que está llamando a qué.

    Pero cuando pasan estas cosas (desde un sitio retorna cero filas y desde otro sitio retorna que sí hay filas) casi siempre la razón es la misma: los dos sitios NO están accediendo al mismo objeto aunque creas que sí que es el mismo.

    Incluso a pesar de lo de "solo instancio una sola vez en el formulario Login a la Clase" muchas veces ocurren cosas inesperadas, como por ejemplo que lo que ocurre es que se instancia dos veces esa clase que a su vez es la que hace la única instanciación del objeto en cuestión. A consecuencia de ello, acaban existiendo dos instancias del objeto a pesar de que solo se instancia en un único sitio.

    En un programa complejo es muy difícil ver estas cosas a simple vista con solo examinar el código fuente. Es el momento de utilizar el debugger. Por ejemplo, busca el constructor de la Clase Usuario que hereda de la clase Persona (y si no lo tiene, añade un constructor predeterminado) y pon en él un punto de ruptura. Ejecuta el programa y verifica cuántas veces se para el debugger en el punto de ruptura. Si lo hace más de una, puedes usar el Stack Trace del debugger para ver desde dónde ha sido llamado.

    Si el problema no estuviese ahí, sigue usando el debugger para parar la ejecución en todos los sitios donde se acceda a la tabla que tiene el problema, y cada vez que se pare en uno de estos puntos examina el contenido para ver en qué momento se ha perdido el registro que falta.

    sábado, 14 de diciembre de 2019 16:15
  • Como te dicen tal ves no estés llamando al mismo objeto , puedes subir el metodo de Login.CrearTablaUsuario();

    Si necesitas ayuda sube tu avance de otro modo no puedo ayudarte , Suerte!

    domingo, 15 de diciembre de 2019 0:06