none
Como puedo mandar a llamar una clase con atributos llenados en un form1 a un form2 y que no me los tire null RRS feed

  • Pregunta

  • Tengo problemas cuando lleno los atributos de una clase en un form1 para poder usar los valores que tiene la clase en un form2 alguna ayuda por favor explicacion
    sábado, 21 de septiembre de 2019 6:52

Todas las respuestas

  • Hola cheleui:

    Puedes echarle un ojo a este artículo sobre lo que propones. Tienes varias opciones.

    Comunicar Formularios

    https://ltuttini.blogspot.com/search/label/WinForm

    sábado, 21 de septiembre de 2019 8:22
  • [...] poder usar los valores que tiene la clase en un form2 [...]

    Es un error común pretender leer "los valores que tiene la clase". El error está en que no los tiene la clase, sino que los tiene la instancia de la clase.

    Así que se necesita que cuando instancies el Form2 para mostrarlo conserves la variable en la que guardaste la instancia. Esa variable es la que se usa para leer los valores. No puedes leerlos solo con decir que es "el Form2" porque podría haber varias copias abiertas del Form2 y hay que decir cuál de ellas quieres usar. Aunque tú sepas que solo has abierto una, el compilador no lo sabe; hay que usar la sintaxis correcta para indicarle la instancia.

    Te pongo un ejemplo en C# ya que no has especificado en qué lenguaje trabajas. Supongamos que has abierto el Form2 así:

    Form2 frm = new Form2(); frm.Show();

    Entonces esa variable que hemos llamado "frm" es la que guarda la instancia. Tienes que conservar esa variable porque es la que vas a usar para leer los datos que quieras del Form2. Por ejemplo, para llamar a una propiedad llamada MiDato (que tienes que marcar como "public" dentro de Form2), lo harías así:

    var resultado = frm.MiDato; // Ojo, NO "Form2.MiDato".

    sábado, 21 de septiembre de 2019 8:30
  • Me puedes ayudar basandote en este ejemplo

    Aqui esta lo que ingreso del formulario 1

     public partial class Form1 : Form
        {
            Estudiante student = new Estudiante();
            public Form1()
            {
                InitializeComponent();
            }

            private void btncapturar_Click(object sender, EventArgs e)
            {
                Estudiante student = new Estudiante();
              
                student.Carnet = textcarnet.Text;
                student.Nombre = textnombre.Text;
                student.FechaNacimiento = Convert.ToString(dtpfechana.Value.ToShortDateString());
                student.Correo = textcorreo.Text;
                student.Responsable = textresponsable.Text;
                double notas = student.CalPromedio();
             
              

                MessageBox.Show("Carnet: " + student.Carnet + "\nNombre: " + student.Nombre + "\nFechaNacimiento: " + student.FechaNacimiento + "\nCorreo: " + student.Correo +
                    "\nResponsable: " + student.Responsable + "\nPromedio: " + notas);
            }

     Aqui lo que ingreso del formulario 2

      private void btningresar_Click(object sender, EventArgs e)
            {
                try
                {
                  
                    student.Notas[0] = double.Parse(textnota1.Text);
                    student.Notas[1] = double.Parse(textnota2.Text);
                    student.Notas[2] = double.Parse(textnota3.Text);
                    MessageBox.Show("Ingresado");
                    this.Close();               
                }
                catch
                {
                    MessageBox.Show("Revise los datos");
                }
            }

    Todo eso en la clase estudiante

    public class Estudiante
        {
            private string carnet;
            private string nombres;
            private string fechanacimiento;
            private string correo;
            private string responsable;
           public double[] notas = new double[3];

            public string Carnet
            {
                get { return carnet; }
                set
                {
                    carnet = value;
                    if (carnet == "")
                        throw new Exception("No debe dejar en blanco el carnet");
                    //if (carnet != "[A-Z][A-Z][0-9][0-9][0-9][0-9][0-9][0-9]")
                    //{
                    //    throw new Exception("Datos incorrectos de carnet");
                    //}

                }
            }

            public string Nombre
            {
                get { return nombres; }
                set
                {
                    nombres = value;
                    if (nombres == "")
                        throw new Exception("No debe dejar vacio el nombre");
                }
            }

            public string FechaNacimiento
            {
                get { return fechanacimiento; }
                set { fechanacimiento = value; }
            }

            public string Correo
            {
                get { return correo; }
                set
                {
                    correo = value;
                    if(correo == "")
                    {
                        throw new Exception("No debe dejar correo vacio");
                    }
                }

            }

            public string Responsable
            {
                get { return responsable; }
                set
                {
                    responsable = value;
                    if(responsable == "")
                    {
                        throw new Exception("No debe dejar el campo responsable vacio");
                    }
                }
            }
            public double[] Notas
            {
                get { return notas; }
                set { notas = value; }
            }
          
            public double CalPromedio()
            {
                double promedio;
                promedio = (Notas[0] + Notas[1] + Notas[2]) / 3;
                return promedio;
               
            }
        }
    }

    sábado, 21 de septiembre de 2019 16:07
  • Desde estos dos formularios

    para que al hacer click en capturar me muestre los datos del Form1 y el Form2

    sábado, 21 de septiembre de 2019 16:09
  • Hola cheleui:

    Una opción, dado que tu form1 es para 1 estudiante

        public partial class Form1 : Form
        {
            Estudiante student = new Estudiante();
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btnCapturar_Click(object sender, EventArgs e)
            {
                
    
                student.Carnet = textcarnet.Text;
                student.Nombre = textnombre.Text;
                student.FechaNacimiento = Convert.ToString(dtpfechana.Value.ToShortDateString());
                student.Correo = textcorreo.Text;
                student.Responsable = textresponsable.Text;
                double notas = student.CalPromedio();
    
    
    
                MessageBox.Show("Carnet: " + student.Carnet + "\nNombre: " + student.Nombre + "\nFechaNacimiento: " + student.FechaNacimiento + "\nCorreo: " + student.Correo +
                    "\nResponsable: " + student.Responsable + "\nPromedio: " + notas);
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                /* este es el botón de ingresar notas */
                Form2 form = new Form2();
                form.ShowDialog();
                student.Notas[0] = double.Parse(form.textBoxPeriodo1.Text);
                student.Notas[1] = double.Parse(form.textBoxPeriodo1.Text);
                student.Notas[2] = double.Parse(form.textBoxPeriodo1.Text);
                form.Close();
            }
    
    
        }
    }
    

    Luego en el diseñador del form2, estableces el modificador de cada uno de los textBox como Public

        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
    
            private void buttonIngresar_Click(object sender, EventArgs e)
            {
                this.Close();
            }
        }
    }

    Lo único que cambia, es que form1 tiene un objeto tipo Estudiante y es sobre quien trabajay después de abrir form2, justo antes de cerrar, lee los textbox públicos, y lo guarda en el objeto Estudiante.

    Espero te ayude

    domingo, 22 de septiembre de 2019 4:30
  • Me puedes ayudar basandote en este ejemplo

    Observo que no has entendido nada de lo que te dije acerca de la importancia de la instancia, porque en el ejemplo has mostrado de todo menos la parte importante, que es el sitio en el que creas la instancia de form.

    Fíjate en la respuesta que te ha puesto Javi Fernandez y en particular observa el siguiente fragmento, que es la parte clave:

            private void button2_Click(object sender, EventArgs e)
            {
                /* este es el botón de ingresar notas */
                Form2 form = new Form2();
                form.ShowDialog();
                student.Notas[0] = double.Parse(form.textBoxPeriodo1.Text);
                student.Notas[1] = double.Parse(form.textBoxPeriodo1.Text);
                student.Notas[2] = double.Parse(form.textBoxPeriodo1.Text);
                form.Close();
            }

    Observa cómo instancia el "new Form2" y lo guarda en la variable "form". Esa es la parte crítica, ya que luego usa esa variable para acceder a los datos del Form2, donde pone form.textBoxPeriodo1. Como ves, esto es lo que faltaba en tu ejemplo, ya que no pusiste el sitio desde el que abres el Form2, que es la parte importante para poder acceder al contenido.

    domingo, 22 de septiembre de 2019 10:04
  • Muchas gracias

    lunes, 23 de septiembre de 2019 3:05
  • Muchas gracias me sirvio mucho se lo agradezco
    lunes, 23 de septiembre de 2019 3:05