none
Pasar un objeto de un formulario a otro por referencia RRS feed

  • Pregunta

  • Hola estoy aprendiendo a usar Entity Framework y tengo una duda, como puedo pasar de un formulario a otro un objeto que esta relacionado a la base de datos, estoy haciendo la app con CODE FIRST ya tengo la bd creada desde código y lo demás. pero por ejemplo tengo la app para agregar usuario (es donde estoy practicando el Insert, Delete, Update, Ver) entonces para agregar y editar una persona (usuario) abro un segundo formulario que si no hay ninguna persona seleccionada en el gridview me crea uno nuevo pero si esta uno seleccionado que pase lo valores en los textbox del segundo formulario los pueda editar y me guarde los cambios e visto que se hace con algo llamado Bindings y la palabra reservada ref pero no se como se usan si me pudieran ayudar... 

    aquí les dejare el código de como lo hago actualmente (y funciona) pero la vdd no me gusta para nada!!!

    Entidad persona:

    public class Persona
        {
            public int Id { get; set; }
            public string Nombre { get; set; }
            public string Direccion { get; set; }
            public string Sexo { get; set; }
    
        }

    Crear BD (tabla aun no me meto mas a fondo para crear la BD XD):

    class BaseDatos: DbContext 
        {
            public BaseDatos():base (Properties.Settings.Default.ConStr)
            {
            }
    
            public DbSet<Persona> Personas { get; set; }
        }

    Aquí están los métodos de agregar y actualizar:

    void Guardar(ref Persona P)
            {
                var perosna = new Persona()
                {
                    Nombre = textBox1.Text,
                    Direccion = textBox2.Text,
                    Sexo = textBox3.Text
                };
                using (BaseDatos obj = new BaseDatos())
                {
                    obj.Personas.Add(perosna);
                    obj.SaveChanges();
                }
            }
    void Actualizar(int i)
            {
                using (BaseDatos db = new BaseDatos()) 
                {
                    var editar = (from x
                                  in db.Personas
                                  where x.Id == i
                                  select x).Single();
    
                    editar.Nombre = textBox1.Text;
                    editar.Direccion = textBox2.Text;
                    editar.Sexo = textBox3.Text;
                    db.SaveChanges();
                }
            }
                

    Con el botón actualizar tengo que mandarle los valores desde el grid con el objeto persona y lo hago de esta forma

    private void button2_Click(object sender, EventArgs e)
            {
                p.Id = int.Parse(dataGridView1.CurrentRow.Cells["Id"].Value.ToString());
                p.Nombre = dataGridView1.CurrentRow.Cells["Nombre"].Value.ToString();
                p.Direccion = dataGridView1.CurrentRow.Cells["Direccion"].Value.ToString();
                p.Sexo = dataGridView1.CurrentRow.Cells["Sexo"].Value.ToString();
                Editar obj = new Editar(ref p);
                obj.Show();
                this.Hide();
            }

    Entonces lo que quiero es pasar por ref el objeto persona ("p") pero sin tener que asignarle de esta forma tan fea los valores a las propiedades de la persona y como les comente vi algo relacionado con el binding pero la vdd no entendí, y así poder ahorrarme el método actualizar porque el método guardar lo puede hacer solo pasando le el objeto a editar!!!

    Alguna ayudadita???

    jueves, 2 de noviembre de 2017 16:00

Respuestas

  • hola

    >>si no hay ninguna persona seleccionada en el gridview me crea uno nuevo pero si esta uno seleccionado que pase lo valores en los textbox del segundo formulario los pueda editar

    no se realiza de esta forma, no deberias pasar ningun dato de la lista al form de edicion, solo deberias pasar el id o codigo de la entidad

    la idea es que desde el form del grid pases el id con un dato simple y recuperes la entidad consultando la db por medio de entity framework

    aqui

    [WinForms] Edición Empleados

    no uso entity framework pero si explico esta tecnica para editar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Sully Ruiz jueves, 2 de noviembre de 2017 20:40
    jueves, 2 de noviembre de 2017 17:16

Todas las respuestas

  • Buenas, 

    A que te refieres po asignar de una manera tan fea? lo que haces es perfectamente valido, si te gusta más, puedes buscarlo en la DB mediante LinQ para obtener un objeto de tipo persona que pasarle, de esa manera haces más "elegante" el codigo (por decir algo...), pero estas forzando a consultar datos que ya tienes en tu datagridview, así que no tiene ningún sentido...

    Otra opción que se me ocurre, es pasar un datagridviewrow por el constructor, y tomar desde ahí los datos.

    Para ambos casos, tendrías que cambiar el Show() por ShowDialog(), de modo que te de tiempo a operar el dato antes de devolverlo al formulario principal.

    Por ultimo, la manera más elegante (esta vez si, elegante), es comunicar formularios de forma desacoplada (es decir, que no dependan los unos de los otros obligatoriamente, o que dependan lo mínimo posible). El compañero Leandro tiene una entrada excelente en su blog sobre el tema

    Comunicar formularios de forma desacoplada

    De esta manera, vas a poder enviar los datos sin problemas.

    Y ahora la pregunta obvia, porque no, ya que usas entity framework, en vez de pasar un objeto como referencia, no pasas el "ID" de la persona a actualizar? cuando vayas a cargar el segundo formulario, recuperas los datos de esa persona y los muestras, teniendo en cuenta que ya los recuperas al pulsar actualizar, te va a dar igual, simplemente añades un constructor sin parametros y uno con un parametro int para el id, si es sin parametros, sabes que es para añadir una nueva persona, si es con parametros, sabes que es para actualizar una persona, y lo primero que haces es recuperarla de la DB, el resto seria igual.

    Nos comentas si tienes dudas

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    jueves, 2 de noviembre de 2017 16:15
  • hola

    >>si no hay ninguna persona seleccionada en el gridview me crea uno nuevo pero si esta uno seleccionado que pase lo valores en los textbox del segundo formulario los pueda editar

    no se realiza de esta forma, no deberias pasar ningun dato de la lista al form de edicion, solo deberias pasar el id o codigo de la entidad

    la idea es que desde el form del grid pases el id con un dato simple y recuperes la entidad consultando la db por medio de entity framework

    aqui

    [WinForms] Edición Empleados

    no uso entity framework pero si explico esta tecnica para editar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Sully Ruiz jueves, 2 de noviembre de 2017 20:40
    jueves, 2 de noviembre de 2017 17:16