none
Pasar un Datagrid de un Formulario a otro y viceversa en C# RRS feed

  • Pregunta

  • Hola amigos estoy haciendo una aplicacion y necesito abrir un formulario que tiene un datagrid y debe llenarlo con informacion y al terminar pasar este datagrid al formulario 1. y si el usuario decide editar filas del datagrid (del segundo formulario), entonces abrir el formulario y que cargue nuevamente el datagrid con la informacion que ingreso nuevamente.

    lo explico asi:

    -- en un formulario tengo dos formularis: Frm1 y Frm2

    --entonces en el Frm1 tengo: textbox y label y un boton para abrir el Frm2. (OJO en el Frm1 no tengo un datagrid).

    --en el Frm2 tengo: un boton para agregar la fila al datagrid, 3 cajas de texto con sus Labels y un datagrid con 3 columnas; entonces en este formulario el usuario agrega filas al datagrid como sea necesario. entonces cuando el usuario usuario cierre el formulario el contenido del datagrid se guarde en una variable global.

    --ahora una vez que cierre el Frm2 el usuario, si decide editar o agregar filas al datagrid (QUE ESTA en el Frm2) entonces al abrir el Frm2 cargue las filas que ingreso anteriormente desde la variable global.

    lo que hice fue que en una clase declare una varible como global: public static DataGridView Dgv_Tmp = new DataGridView();

    --dentro del Frm2 declare una variable publica: public DataGridView dgv = new DataGridView();

    //abro el Frm2

    Frm2 f = new Frm2();

    f.dgv = Dgv_Tmp //Dgv_Tmp es la variable global y la asigno a la variable publica del Frm2 (dgv)

    f.ShowSialog();

    cuando abro el Frm2 en el evento Load le asigno la variable dgv al datagrid del Frm2

    this.Dgv_Detalle = dgv; //que dgv es la variable publica local del Frm2

    y en el evento FormClosed del Frm2 tengo:

    dgv = this.Dgv_Detalle;

    La cosa es que cuando cierro el Frm2 la variable global no tiene nada osea no guarda los datos.

    intente poner el Datagrid del Frm2 con la propiedada Modifiers=Pulic, y tampoco la variable capta los datos, e inclusive cuando cierro el Frm2 cuando reviso paso por paso dice que el datagrid (del Frm2) no tiene filas.

    que puedo hacer, no se si me hace falta algo, o estoy haciendo un procedimiento indevido..

    lunes, 16 de marzo de 2015 18:35

Respuestas

  • Hola.  Le corrijo un par de errores:

    1. La variable global que usted muestra no debe incializarse más de una vez.  De hecho no sé si usted incurre en este error o no, pero es bueno mencionarlo.
    2. Uno no mantiene un DataGridView en una variable global:  Uno mantiene los datos del DGV en una variable global.

    Dice que tiene 3 columnas.  Debería entonces tener una clase con 3 propiedades que además implemente INotifyPropertyChanged.

    //Le muestro una clase POCO.  Debe modificarla para implementar
    //INotifyPropertyChanged.
    public class Dato
    {
        public TipoDeDato Prop1 { get; set; }
        public TipoDeDato Prop2 { get; set; }
        public TipoDeDato Prop3 { get; set; }
    }
    

    Luego la variable global sería una lista de objetos tipo Dato (la clase que declaramos arriba).

    //Preferiblemente la colección sería tipo BindingList<> o bien
    //ObservableCollection<>, pero List<> funciona para casos sencillos.
    public static List<Dato> Datos = new List<Dato>();

    Luego cada vez que abre un nuevo formulario Form2, en el Load asigna la lista global a la propiedad DataSource del DGV.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Eldeyvi martes, 17 de marzo de 2015 17:05
    lunes, 16 de marzo de 2015 18:53
    Moderador

Todas las respuestas

  • Hola.  Le corrijo un par de errores:

    1. La variable global que usted muestra no debe incializarse más de una vez.  De hecho no sé si usted incurre en este error o no, pero es bueno mencionarlo.
    2. Uno no mantiene un DataGridView en una variable global:  Uno mantiene los datos del DGV en una variable global.

    Dice que tiene 3 columnas.  Debería entonces tener una clase con 3 propiedades que además implemente INotifyPropertyChanged.

    //Le muestro una clase POCO.  Debe modificarla para implementar
    //INotifyPropertyChanged.
    public class Dato
    {
        public TipoDeDato Prop1 { get; set; }
        public TipoDeDato Prop2 { get; set; }
        public TipoDeDato Prop3 { get; set; }
    }
    

    Luego la variable global sería una lista de objetos tipo Dato (la clase que declaramos arriba).

    //Preferiblemente la colección sería tipo BindingList<> o bien
    //ObservableCollection<>, pero List<> funciona para casos sencillos.
    public static List<Dato> Datos = new List<Dato>();

    Luego cada vez que abre un nuevo formulario Form2, en el Load asigna la lista global a la propiedad DataSource del DGV.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Eldeyvi martes, 17 de marzo de 2015 17:05
    lunes, 16 de marzo de 2015 18:53
    Moderador
  • Gracias por tu respuesta, es una solucion simple y eficiente.

    La verdad que no he utilizado ese tipo de listas pero veo que siempre hay algo nuevo que aprender.

    martes, 17 de marzo de 2015 17:06
  • Gracias por tu respuesta, es una solucion simple y eficiente.

    La verdad que no he utilizado ese tipo de listas pero veo que siempre hay algo nuevo que aprender.

    martes, 17 de marzo de 2015 17:06