C sharp - Pasar una lista a otro form en C#

 
Vista:
sin imagen de perfil
Val: 15
Ha aumentado su posición en 4 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Camilo (8 intervenciones) el 05/01/2020 02:37:08
Tengo en el formulario FormConsultarAlumnos una lista y la quiero pasar a el formulario FormAgregarCalificacion. Esta la envie por el constructor al formulario receptor sin embargo no se porque la cuando intento imprimir la lista en un DGV o demás cosas no me lo permite (al parecer los objetos que guarde ahí no están). Podrían ayudarme... Gracias
1
2
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Roy
Val: 44
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Roy (23 intervenciones) el 05/01/2020 18:14:59
Para llenar el dgv lo que necesitas es un DataSource, que en tu caso es directorio. En el constructor de FormAgregarCalificacion estas creando las columnas de directorio pero no estas agregando los datos.
En el inicializador de FormAgregarCalificacion no es necesario que pases listaEstudiante como argumento. El objeto listaEstudiante lo tienes declarado como public static, de manera que puedes utilizarlo en todo tu proyecto sin restricciones.
Lo que puedes hacer es:
1. Declara el DT directorio de FormConsultarAlumnos como public static.
2. En el inicializador de FormAgregarCalificacion, en lugar de recibir listaEstudiante, que reciba FormConsultarAlumnos. Y el el form que recibe (FormAgregarCalificacion) declaras una variable publica interna FormAgregarCalificacion, la cual cargas con el argumento recibido en el inicializador del form.
3. La carga de listaEstudiante y de directorio, no deberias de hacerla en el inicializador del form, es mas conviniente hacer estos procesos en un evento determinado, como el Form_Load.
4. En el inicializador de FormAgregarCalificacion, estas cargando 2 veces el DataSource para dgvCalificacion. Logicamente, solo el segundo sera cargado (por lo que la primera linea: "dgvCalificacion.DataSource = listaAlumno;" puedes eliminarla,
Entonces resumiendo, en FormConsultarAlumnos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static List<EstudianteMatriculado> ListaEstudiante;
public static DataTable directorio;
 
public FormConsultarAlumnos()
{
     InitializeComponent();
}
 
private void FormConsultarAlumnos_Load (object sender, EventArgs e)
{
     //inicializa y carga directorio
     directorio = new DataTable();
     //crea los columns
     directorio.Columns.Add("");
     //.... el resto de columnas
     //carga alumnos
     EstdianteMatriculado alumno1 = new EstidianteMatriculado("Nombre", "Apellidos", 123456, 50, 0);
     //... el resto de alumnos
     ListaEstudiante = new List<EstudianteMatriculado>();
     ListaEstudiante.Add(alumno1);
     directorio.Rows.Add(alumno1.NombreAlumno, alumno1.ApellidoAlumno, alumno1.Codigo, alumno1.Grupo);
}
 
//en el evento donde llamas a FormAgregarCalificacion
FormAgregarCalificacion frm = new FormAgregarCalificacion(this);    //se le pasa el form actual (this) como argumento
frm.Show();
Y en el FormAgregarCalificacion:
1
2
3
4
5
6
7
8
9
10
11
12
13
FormConsultarAlumnos frmAlumnos = new FormConsultarAlumnos();
 
public FormAgregarCalificacion (FormConsultarAlumnos frm)
{
     InitializeComponent();
     //carga el argumento en la variable interna
     frmAlumnos = frm;
}
 
private void FormAgregarCalificacion_Load (object sender, EventArgs e)
{
     this.dgvCalificacion.DataSource = frmAlumnos.directorio;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pasar una lista a otro form en C#

Publicado por Cam0104 (3 intervenciones) el 05/01/2020 21:35:15
Lo que pasa es que no quiero que simplemente muestre la lista... Esa lista la necesito en el otro fomr
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roy
Val: 44
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Roy (23 intervenciones) el 05/01/2020 21:45:09
Con las modificaciones que te estoy indicando tanto la lista (ListaEstudiante) como el DT (directorio) son publicos y los puedes usar en cualquiera de tus forms. Incluso puedes modificar ambos recursos desde cualquier parte de tu proyecto
Yo no estoy agregando la carga del dgv en FormConsultarAlumnos, pero obviamente puedes hacerlo utilizando los mismos recursos.
En estos casos, yo acostumbro crear una clase publica y ahi agrego los recursos necesarios (en tu caso, la lista y el DataTable) de esta forma me garantizo la disponibilidad de los datos, ya que una clase no necesita inicializarse, simplemente se invoca.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pasar una lista a otro form en C#

Publicado por Cam0104 (3 intervenciones) el 05/01/2020 21:52:25
Aparece un eror al utilizar

FormAgregarCalificacion form = new FormAgregarCalificacion(this);
Dice que this no la puedo utilizar
LE paso el form propiamente y no lo permite
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roy
Val: 44
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Roy (23 intervenciones) el 05/01/2020 22:00:38
En el constructor de FormAgregarCalificacion debes agregar el FormConsultarAlumnos como argumento, para que al crear el form te pueda recibir el parametro:
1
2
3
4
5
6
public FormAgregarCalificacion (FormConsultarAlumnos frm)
{
     InitializeComponent();
     //carga el argumento en la variable interna
     frmAlumnos = frm;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pasar una lista a otro form en C#

Publicado por Cam0104 (3 intervenciones) el 05/01/2020 22:05:54
//en el evento donde llamas a FormAgregarCalificacion
FormAgregarCalificacion frm = new FormAgregarCalificacion(this); //se le pasa el form actual (this) como argumento
frm.Show();

A que te refieres "en el evento donde llamas a FormAgregarCalificacion"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roy
Val: 44
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Roy (23 intervenciones) el 05/01/2020 22:12:05
El FormAgregarCalificacion tienes que llamarlo desde algun evento, me imagino que en el Click de un Button o el SelectionChanged del DataGridView
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 15
Ha aumentado su posición en 4 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Camilo (8 intervenciones) el 05/01/2020 22:16:31
1
2

El error dice: "No se puede obtener acceso al miembro 'FormConsultarAlumnos.directorio' con una referencia de instancia
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roy
Val: 44
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Roy (23 intervenciones) el 05/01/2020 22:36:50
Disculpa, te dije que declararas el DataTable directorio como public static, en realidad debe ser public pero no static:
1
public DataTable directorio;    //sin static
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 15
Ha aumentado su posición en 4 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Camilo (8 intervenciones) el 05/01/2020 22:41:02
En ejecucion aparece esto. Gracias por la ayuda a proposito
ejejec
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roy
Val: 44
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Roy (23 intervenciones) el 05/01/2020 22:50:17
Primero hay que verificar que directorio no venga vacio o null:
1
2
3
4
if (frmAlumno.directorio != null && frmAlumno.directorio.Rows.Count > 0)
    this.dgvCalificacion.DataSource = frmAlumno.directorio;
else
    MessageBox.Show("No hay datos para cargar");
Si directorio viene null entonces debes asegurarte que el dt venga cargado con los datos antes de llamar a FormAgregarCalificacion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roy
Val: 44
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Roy (23 intervenciones) el 05/01/2020 23:09:49
Antes de llamar a FormAgregarCalificacion verifica que directorio esté inicializado y que traiga datos.
Puedes colocar un breakpoint antes de la linea donde llamas a FormAgregarCalificacion y ahi verificar es estado de directorio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 15
Ha aumentado su posición en 4 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Camilo (8 intervenciones) el 06/01/2020 00:35:44
Aun sigo con el error
No se si influye esto... Para hacer el llamado de los forms cree un metodo pero se dalla ya que el constructor del Form recibe algo. Asi que puse esto

1
2
3
4
// AbrirFormulario<FormAgregarCalificacion>(); //El que tenia antes
 
FormAgregarCalificacion form = new FormAgregarCalificacion(null); // El que tengo ahora
    form.Show();

Porque básicamente lo que quiero con la lista es que al profesor ingresar la calificación cambien la nota del estudiante... Pero sin ella funcionando es complicado aplicarlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 707
Oro
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Wilfredo Patricio Castillo (416 intervenciones) el 06/01/2020 15:47:32
Hola.

El error que estás teniendo es algo tan ingenuo como lo siguiente:

En el constructor donde recibes la lista, antes de cualquier otra linea debes tener el InitializeComponents, y con eso ya no tendrás problemas

Primero el Inbitializecomponents y luego la linea donde recibes la lista, eso sería todo.

Otro punto a tener en en cuenta es que teniendo la lista, no veo la necesitadad de agregarlo a un datatable, si con la lista puedes hacer todo.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 15
Ha aumentado su posición en 4 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Camilo (8 intervenciones) el 06/01/2020 16:56:51
a1
a2
a3

Realice lo que me sugeriste (lo cual ya habia hecho) y aun asi no muestra los datos.
Por otro lado tengo un form llamado FormDocente el cual al darle clic a los botones llama repectivamente el formulario que le corresponde sin embargo como el constructor del formulario FormAgregarCalificaciones recibe una lista, genera un error porque hay que enviarle parametros sin embargo yo simplemente le puse null, creo que tal vez esto este haciendo que no de el resultado esperado.


a4
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roy
Val: 44
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Roy (23 intervenciones) el 06/01/2020 20:13:15
Bien, terminemos con el caso inicial. Me parece que queda mejor si le pasas la lista al constructor en vez del form completo. Pero igual como te indicaba antes, la carga del datagrid es mas conveniente hacerla en el evento Load del form y no en el constructor. Y por otro, carga el datagrid con los datos del datatable, no con la lista; y por supuesto, hay que llenar el DataTable antes de pasarlo al datagrid (solamente estas creando las columnas pero no estas agregando las filas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
List<EstuduanteMatriculado> listaAlumnos;
public FormAgregarCalificacion (List<EstudianteMatriculado> estudiantes)
{
     InitializaComponent();
     if (estudiantes != null)
          listaAlumnos = estudiantes;
}
 
private void FormAgregarCalificacion_Load (object sender, EventArgs e)
{
     DataTable directorio = new DataTable();
     directorio.Columns.Add("NombreEstudiante");     //es conveniente que los nombre de las columnas sean una sola linea de texto, sin
                                                                                     espacios en blanco
     //agregas el resto de las columnas
     //y luego las filas
     foreach(EstudianteMatriculado alumno in listaAlumnos)
     {
          directorio.Rows.Add(alumno.Nombre, alumno.Apellido, alumno.Codigo, alumno.Grupo);
     }
     this.dgvCalificacion.DataSource = directorio;
}
En este codigo estas trabajando con una instancia de ListaEstudiante, y los datos que muestras y modificas los tratas por medio de esa instancia que se llama listaAlumnos. Obviamente para que la lista original se mantenga actualizada, cada vez que modificas listaAlumno, debes tambien modificar la lista original ListaEstudiante que esta en FormConsultarAlumnos y cuando cierras el FormAgregarCalificacion debes actualizar el gridview en FormConsultarAlumnos.

Con el otro punto, si tienes otro form que tambien llama a FormAgregarCalificacion pero sin pasarle la lista, no tienes que poner null. Lo que debes hacer es crear un segundo constructor para el FormAgregarcalificacion, dejas el que tenemos ahora (que recibe la lista) y creas un nuevo constructor que no recibe nada (con parentesis vacio):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//constructor que recibe lista
public FormAgregarCalificacion (List<EstudianteMatriculado> estudiantes)
{
     InitializaComponent();
     if (estudiantes != null)
          listaAlumnos = estudiantes;
}
//constructor que no recibe nada
public FormAgregarCalificacion ()
{
     InitializaComponent();
}
 
//de esta manera, puedes llamar a FormAgregarCalificacion de 2 formas diferentes dependiendo de las necesidades:
FormAgregarCalificacion form = new FormAgregarCalificacion(ListaEstudiante);
// o tambien puedes llamar al form sin pasar argumentos
FormAgregarCalificacion form = new FormAgregarCalificacion();
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 707
Oro
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Wilfredo Patricio Castillo (416 intervenciones) el 07/01/2020 01:31:05
La verdad no entiendo porqué se complican tanto la vida.

A ver, si tienes una lista de alumnos, personas, gatos de lo que sea, y se los quieres pasar a otro formulario, se lo pasas en el constructor del formulario que recibe, entonce si lo que vas a enviar es una lista de alumnos, el contructor debe esperar una lista de alumnos, el nombre de la lista es lo de menos, y con eso es suficiente.

En tu formulario que recibe la lista debes declarar una lista de alumnos de ámbito privado, ya que esa será la que reciba la lista en el constructor algo así:

private List<Alumno> listaAlumnos=new List<Alumno>();

Y en el constructor

luego de Initializecomnponents, pones la siguiente línea:

this.listaAlumnos=listaQueReciboEnElConstructor;

Eso sería todo.

Si deseas mostrar esa lista de alumnos en un datagridview, en el load
myDatagridview.Datasource=listaAlumnos;

Con eso tendrás la lista en el otro formulario y además se mostrarán tus datos en el datagridview, no hay mucha ciencia en eso, ya para qué tendría que meter los datos a un datatable y no se a dónde mas?, con eso ya tienes lo que necesitas en el formulario, ya luego si quieres lo insertas a otro lado, lo ordenas filtrar lo que quieras.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 15
Ha aumentado su posición en 4 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Camilo (8 intervenciones) el 07/01/2020 04:07:16
1
2
3
4
private void button2_Click(object sender, EventArgs e)
{
    AbrirFormulario<FormAgregarCalificacion>();
}


Como el constructor del formulario recibe algo se me es obligatorio pasarlo cuando intento abrir el form

Gracias por la ayuda...

a5
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 15
Ha aumentado su posición en 4 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Pasar una lista a otro form en C#

Publicado por Camilo (8 intervenciones) el 07/01/2020 04:19:40
Recorde la sobrecarga de metodos...
Sin embargo aun no muestra la lista...
Le asigne a ese label que contara el numero de elementos de la lista y da 0

b1
b2
b5
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar